2

C# リストの最初の項目を更新するために 3 つのアプローチ (ケース) を試している次のコードがあります (注: Dump() は LINQPad IDE のヘルパー出力メソッドです)。ケース 3 では成功するのに、ケース 2 ではリストの更新が成功しない理由について説明をいただければ幸いです。first と list[0] は両方とも、リスト内の最初のアイテムへの参照であり、直接参照が割り当てられた場合と同等に動作する必要があります。どうやらそうではないようです...

void Main()
{
Person first =  null;
List<Person> list = CreateList(out first);

//Case 1
//This updates the list
first.fname = "Third"; 
list.Dump(); //outputs third, second


//Case 2
//This does not update the list
list = CreateList(out first);
first= new Person() { fname="Third"}; 
list.Dump(); //outputs first, second


//Case 3
//This updates the list
list = CreateList(out first);
list[0] = new Person() { fname="Third"}; 
list.Dump(); //outputs third, second

}

List<Person> CreateList(out Person first)
{
  var list = new List<Person>
  {
  new Person() { fname="First", lname = ""},
  new Person() { fname="Second", lname = ""}
  };
  first = list.Find( x => x.fname == "First");
  return list;
}

// Define other methods and classes here
class Person
{
  public string fname;
  public string lname;
}
4

2 に答える 2

0

新しいオブジェクトを参照オブジェクトに渡すとき

first= new Person() { fname="Third"};

オブジェクトがコレクションで識別される新しいハッシュコードで新しいオブジェクトを生成します。リストは以前のハッシュコードを見つけられないため、リストは更新されません。//ケース 2

ただし、ケース3では、オブジェクトのインスタンスを置き換えているため、リストは新しいハッシュを更新します

ケース1では、オブジェクトのプロパティのみを変更し、ハッシュはそのまま残ります

これはあなたの問題の説明かもしれません

于 2013-03-12T06:15:40.820 に答える
0

first次のコードを使用しての参照を新しいオブジェクトに変更するため、2 番目のケースは機能しません。

first= new Person() { fname="Third"};

このコードの実行後、firstリスト オブジェクトは再度参照されません。

2番目のケースでこれを使用してみてください:

list = CreateList(out first);
if(first != null)
   first.fname="Third";
list.Dump();

firstこれにより、のプロパティが設定され、first引き続きリスト項目が参照されます。

于 2013-03-12T05:54:34.763 に答える