ホームページ  >  記事  >  バックエンド開発  >  C# の文字列は値型ですか、それとも参照型ですか?

C# の文字列は値型ですか、それとも参照型ですか?

黄舟
黄舟オリジナル
2017-03-04 10:34:191688ブラウズ

まずコードを見てください:

           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) をご覧ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。