■13164 / inTopicNo.7) |
Re[1]: object 同士の比較 |
□投稿者/ OGAKUZU (15回)-(2008/01/25(Fri) 11:17:15)
|
> string s1 = "abc"; > string s2 = "ABC".ToLower(); > > の時 > > object n1 = s1; > object n2 = s2; > > System.Console.WriteLine(n1 == n2); > System.Console.WriteLine(s1 == s2); > > の結果を正しく予測できます?
↑このコメントをいただいた時点では、結果を予測することができませんでした。 (動作パターンがいくつも想定され、ひとつの答えにたどり着きませんでした)
なので、実際に動かしてみて、また
> [型 (C# リファレンス)] > http://msdn2.microsoft.com/ja-jp/library/3ewxz6et(VS.80).aspx > > ボクシング/アンボクシング(ボクシング化とボクシング化解除)も併せて、理解しておくと良いですね。 > (上記ページからリンクでたどれます。)
↑この資料に目を通した上で、自分なりに、動作を解釈しました。
◆実行内容と結果
// ひどりさんからの宿題
string s1 = "abc"; string s2 = "ABC".ToLower(); object n1 = s1; object n2 = s2; System.Console.WriteLine(n1 == n2); // 結果:False System.Console.WriteLine(s1 == s2); // 結果:True
// 自分で追加
string s3 = "abc"; object n3 = s3; System.Console.WriteLine(n1 == n3); // 結果:True System.Console.WriteLine(s1 == s3); // 結果:True
System.Console.WriteLine(object.ReferenceEquals(n1, n2)); // 結果:False System.Console.WriteLine(object.ReferenceEquals(s1, s2)); // 結果:False System.Console.WriteLine(object.ReferenceEquals(n1, n3)); // 結果:True System.Console.WriteLine(object.ReferenceEquals(s1, s3)); // 結果:True
◆解釈
> string s1 = "abc"; > string s2 = "ABC".ToLower(); > string s3 = "abc";
s1, s3 は、値が同じなので「メモリ空間を節約する機構が働き」実データを共有した。
s1, s2 は、値は同じ(どちらも"abc")であるが、.ToLower()が絡んだので、異なる実データを持った。 (string クラスにもいろいろ事情があるのだと思います)
> object n1 = s1; > object n2 = s2; > object n3 = s3;
n1, n3 は、共有されている実データからのボクシング化なので、ヒープ上のデータも共有した。 n1, n2 は、異なる実データからのボクシング化なので、ヒープ上のデータも別々に確保した。
以上です。
渋木宏明(ひどり)さん、七曜さん、ありがとうございました。
つっこみどころがありましたら、引き続きご指導お願いします。
|
|