まずコードを見てください:
int a = 1; int b = a; a = 2; bool valOrRef = b == 2 ;//false;
aに続いてbが変更されていないため、int型が値型であることがわかります。
もう一度次のコードを見てください:
string str11 = "qa"; string str22 = str11; str11 = "qaz"; bool valOrRef2 = str22 == "qaz"; //false
結果も false なので、string も値の型です。
次のコードをもう一度見てください:
string str1 = "qaz"; string str2 = "qaz"; bool refequ = object.ReferenceEquals(str1, str2); //true
refequ は true に等しいです。 string が実際に値型である場合、どのようにして refequ が true になることができますか。なぜなら、次のコードを見てください:
int a = 1; int b = 1; bool refequ2 = object.ReferenceEquals(a, b);//false
int は値型です。これは確かです、ステートメント 2 の int 変数。
これは矛盾していますが、どう説明すればよいでしょうか。文字列は値型のように見えますが、参照型にも見えます。
Microsoft: string は参照型です。では、値型のようなものをどのように説明すればよいでしょうか?
2 つの点に注意してください:
1) 文字列オブジェクト、値が同じであれば、それらの参照アドレスも同じです。
2) string オブジェクトの値が等しくない場合、それらの参照アドレスは等しくありません。
上記のコードの分析:
string str11 = "qa";//str11指向了内存addressA,数据为qa; string str22 = str11;//str22也指向内存addressA str11 = "qaz";//str11新指向了内存addressB,数据为qaz bool valOrRef2 = str22 == "qaz"; //false
要約:
string の最も重要な特徴の 1 つは、定数の不変性 を備えていることです。文字列を作成したら、その連続部分をマネージド ヒープ メモリ領域にあるため、この文字列を長くしたり短くしたり、形式を変更したりすることはできません。この文字列に対するさまざまな操作によって返されるすべての文字列は、実際には別の再作成された文字列であり、それ自体には変更が生じません。
追記:
弦の効率はどうですか?
文字列オブジェクトは、一度オブジェクトが作成されると、オブジェクトの値を変更できないため、不変(読み取り専用)オブジェクトと呼ばれます。場合によっては、文字列が変更されているように見えることがあります。実際には、値が変更されるたびに、元のオブジェクトが参照したまま、新しい文字列オブジェクトが作成されます。元のオブジェクトなので変更されません。 これが文字列が非効率である理由でもあります。
上記は「C# 文字列は値型か参照型か?」の内容です。その他の関連内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。