C#言語で配列の要素を変更したときに、格納した変数も連動して変更をかけたく試してみて分からなかったので質問させていただきました。
C#
1 #region 値型であるint 2 3 var i_hoge1 = 1; 4 var i_hoge2 = 2; 5 var i_hoge3 = 3; 6 7 var i_hoges = new int[3]; 8 9 i_hoges[0] = i_hoge1; 10 i_hoges[1] = i_hoge2; 11 i_hoges[2] = i_hoge3; 12 13 for (int i = 0; i < i_hoges.Length; ++i) { 14 Console.WriteLine(i_hoges[i]); 15 } 16 17 // 配列に格納したものの内容を変更 18 for (int i = 0; i < i_hoges.Length; ++i) { 19 i_hoges[i] = 10 + i; 20 } 21 // 値型なので連動して変わることはない 22 Console.WriteLine(i_hoge1); 23 Console.WriteLine(i_hoge2); 24 Console.WriteLine(i_hoge3); 25 26 // 逆も然り 27 i_hoge1 = 101; 28 i_hoge2 = 102; 29 i_hoge3 = 103; 30 for (int i = 0; i < i_hoges.Length; ++i) { 31 Console.WriteLine(i_hoges[i]); 32 } 33 34 #endregion 35 36 #region 参照型であるstring 37 38 var s_hoge1 = "hoge1"; 39 var s_hoge2 = "hoge2"; 40 var s_hoge3 = "hoge3"; 41 42 var s_hoges = new string[3]; 43 44 var s_hoges_ = new List<string>(); 45 46 s_hoges[0] = s_hoge1; 47 s_hoges[1] = s_hoge2; 48 s_hoges[2] = s_hoge3; 49 50 for (int i = 0; i < s_hoges.Length; ++i) { 51 Console.WriteLine(s_hoges[i]); 52 } 53 54 // 配列に格納したものの内容を変更 55 for (int i = 0; i < s_hoges.Length; ++i) { 56 s_hoges[i] = "hoge1" + i.ToString(); 57 } 58 // 参照型だから変わると思いきや変更なし 59 Console.WriteLine(s_hoge1); 60 Console.WriteLine(s_hoge2); 61 Console.WriteLine(s_hoge3); 62 63 // 逆も然り 64 s_hoge1 = "hoge101"; 65 s_hoge2 = "hoge102"; 66 s_hoge3 = "hoge103"; 67 for (int i = 0; i < s_hoges.Length; ++i) { 68 Console.WriteLine(s_hoges[i]); 69 } 70 71 #endregion
知りたいこととしましては、配列の要素を変更することで、その番号に追加した元の変数の変更ができないのかという事です。
どうぞよろしくお願いいたします。
質問は string 型で「参照型だから変わると思いきや変更なし」なのは何故かということですか? 他にもあるなら何が分からないか書いてください。
申し訳ございません。少々あいまいな聞き方になっていました。 このやりたいことを実現する方法はあるかという事が知りたいです。
「やりたいこと」というのがまたわからないのですが。「参照型だから変わると思いきや変更なし」というところが「変更あり」になってほしいということですか? であればどのようになってほしいのですか? ところで、string 型は参照型ながら、他の参照型と違って、不変性がある&インターンされるという特殊性があることはご存知ですか?
今回の疑問は https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/strings/index の「文字列オブジェクトの不変性」セクションに書かれている 2 つめのコードを見ると解消するのでは? 一度読んでみてください。
それが分かってないから、この質問だと思います。
そういう話なんでしょうか? 配列とローカル変数を同期して変更したいという話だと思いましたが。
Zuishin様の解釈が私の求めていた答えとなります。 また、いただいたコードをstring型にして試したところ意図した結果を出すことができました。なぜstring型の仕様の話を出されたのか記事を読んでみても分かりません。ただ、細かい仕様は知らなかったので勉強になりました。はっきりとした質問ができるよう気を付けていきたいと思います。ありがとうございました。
自分は、コードのコメント「// 参照型だから変わると思いきや変更なし」というところに目が行っていて、紹介した記事のように変わらないのは当たり前なので、そこの誤解を解けば疑問は解消すると思っていたので、「配列とローカル変数を同期して変更したい」という話だとは全く思ってませんでした。
stringの仕様ではなく配列とローカル変数の同期ができてないから値が変わらないという認識でいます。同じコードで参照型であるclassでも試してみたのですが、値の書き換わりは起きませんでした。classもstring型と同じで特殊なのかは分かりませんし、試し方が悪かったのかもしれませんがどうなのでしょうか。
string の不変性にかかわる話と勘違いしてました。それ以前の話だったようですね。勘違いして間違ったコメントをしてすみません。すでに解決済みとなっていて今さらながらですが、回答欄に説明を書いておきます。
回答3件
あなたの回答
tips
プレビュー