.NETの文字列(2):本当に.NETのStringを知っていますか.

2125 ワード

テキストリンク:http://www.cnblogs.com/hoosway/p/3600593.html
概要
Stringはどの言語にも特殊性があります..NETでもそうです.基本データ型に属し、基本データ型で唯一の参照タイプでもあります.文字列は定数として宣言できますが、スタックに配置されています.本稿では.NETのStringについて深く理解していただきたいと思います.
変更不可オブジェクト
.NETでStringは変更できないオブジェクトです.Stringオブジェクトを作成して値を割り当てると、文字列の値を変更することはできません.この言葉は最初は不思議に聞こえたが、文字列の接続操作をすぐに思い浮かべるかもしれない.私たちも文字列を変えることができるのではないか.次のコードを見てください.
 
1using System;
2
3namespace Demo1
4{
5 /**//// 
6 /// String    
7 /// 
8 public class Test
9 {
10 public static void Main(string[] args)
11 {
12 string a = "1234";
13 Console.WriteLine(a);
14
15 a += "5678";
16 Console.WriteLine(a);
17 Console.ReadLine();
18 }
19 }
20}
21

 
実行結果:
1234
12345678
MyStrの値を「1234」から「12345678」に変更したようです.事実はそうですか.実際には変わっていません.5行目のコードにStringオブジェクトが作成されました.その値は「1234」で、MyStrはメモリ内のアドレスを指します.7行目のコードに新しいStringオブジェクトが作成されました.その値は「12345678」で、MyStrは新しいメモリアドレスを指します.このとき、スタックには2つの文字列オブジェクトが存在します.1つだけ参照していますが、文字列「1234」はメモリに存在します.
参照タイプ
Stringは参照タイプであると前述しましたが、同じ値の文字列オブジェクトを複数作成すると、メモリ内の指向アドレスが同じになるはずです.すなわち、文字列オブジェクトaを作成すると、その値は「1234」であり、値が「1234」の文字列オブジェクトbを作成すると、メモリ領域を割り当てるのではなく、メモリ内のaのアドレスを直接指す.これにより、メモリの有効利用が確保されます.次のコードを見てください.
using System;

namespace Demo2
{
 /**//// 
 /// String      
 /// 
 public class Test
 {
 public static void Main(string[] args)
 {
 string a = "1234";

 Console.WriteLine(a);

 Test.Change(a);


 Console.WriteLine(a);
 Console.ReadLine();
 }

 public static void Change(string s)
 {
 s = "5678";
 }
 }
}

 
実行結果:
1234
1234小さな変更をして、Change(ref string s)に注意します.
using System;

namespace Demo2
{
 /**//// 
 /// String      
 /// 
 public class Test
 {
 public static void Main(string[] args)
 {
 string a = "1234";

 Console.WriteLine(a);

 Test.Change(ref a);

 Console.WriteLine(a);
 Console.ReadLine();
 }

 public static void Change(ref string s)
 {
 s = "5678";
 }
 }
}

    :

1234

5678

 
 
転載先:https://www.cnblogs.com/hoosway/p/3600593.html