2016-05-25 6 views
0

どちらのバージョンIList<T>[i].Method()がインデクサーに電話しますか?設定されたバージョンまたはバージョンを取得しますか?私にはList<MutableStruct> listがあります。私はによって変更可能なメソッドを呼び出し、list[0]が変更されていないことを確認します。私はそれがバージョンを取得し、暗黙的なコピーは予期しないものを呼び出すと思います。ご確認ください。ありがとう。IList [i] .Method()のどのバージョンが呼び出されますか?

+3

変更可能な構造体は悪であり、なぜあなたは最初の手を見ていますか? – juharr

+5

インデクサーを介して構造体を変更する唯一の方法は、**配列**インデクサーを使用することです。他の全ては、 'get'セマンティクスのためコピーを返す。 –

答えて

4

これは、構造体が渡されたときに、構造体全体のコピーを取得するためです。参照型はコピーの参照先です。つまり、リストから構造体を取得すると、コピーがあり、メソッドはそのコピーで呼び出され、リストの中では呼び出されません。これを動作させるには、リストの値を変数に代入してから、それを変更してからそれを割り当てなければなりません。変更可能な構造体が悪いアイデア

public struct MutableStruct 
{ 
    public int Value { get; private set; } 

    public void MutableMethod() 
    { 
     Value = 5; 
    } 
} 
このコードの

var list = new List<MutableStruct>(); 
list.Add(new MutableStruct()); 

Console.WriteLine(list[0].Value); 
list[0].MutableMethod(); 
Console.WriteLine(list[0].Value); 
var x = list[0]; 
x.MutableMethod(); 
list[0] = x; 
Console.WriteLine(list[0].Value); 

出力

と考えられている理由です
関連する問題