- 締切済み
[言語C#] string型における参照値の受け渡し
stringは、参照型に分類されると思います。・・・(1) 【string宣言部抜粋】 public sealed class String : IComparable, ICloneable...... また、参照変数の代入では、オブジェクトの参照値が受け渡されるという認識です。・・・(2) 上記(1)、(2)を踏まえると、次のプログラムの実行結果に納得がいきません。 string aiu = "aiu"; string aiue = aiu; Console.WriteLine(aiue); aiu = "abc"; Console.WriteLine(aiu); Console.WriteLine(aiue); 出力結果---------- aiu abc aiu ------------------ (1)、(2)の考えを取り入れた場合、出力結果は aiu abc abc になるものだと思いましたが、なぜこのような結果になるのでしょうか 。自作クラスで似たような処理を行った場合では、一方の変更が同じインスタンスを代入した他方へも影響することは確認済みです。 ただ、stringの場合では・・・違うみたいです。 初歩的なことだと思いますが、宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Werner
- ベストアンサー率53% (395/735)
C#のstringオブジェクトの内容は変更不可能です。 string型への代入では文字列を変更しているのではなく、 違う文字列が入った新しいstringオブジェクトが作成され それを参照するようになっています。 以下のコードでは、 str1の参照先が変わってもstr2の参照先はそのままなので str2の出力内容は変化しません。 ------------------------------------------------------- string str1 = "aiu"; string str2 = str1; Console.WriteLine(str2); //↓True: str1とstr2は同じオブジェクト Console.WriteLine((object)str1 == (object)str2); str1 = "abc"; //str1は新しいstringオブジェクトを指す Console.WriteLine(str1); Console.WriteLine(str2); //↓False: str1とstr2は違うオブジェクト Console.WriteLine((object)str1 == (object)str2);
お礼
なるほど~。 stringは、変更不可能なクラスなんですね。 参照値の使いまわしができないってことは、 無駄にインスタンスを作成してしまうこともありえますね。 stringクラスのみ、変更不可ってなんかしらの理由が あったんでしょうね。 今、ある機能の実装途中なんですが、 stringの参照値使いまわしではなく、他の方法を なんかしら考えて、実装していきたいと思います。 勉強になります。 すごく迷っていたので助かりました。ありがとうございました。