2

我有以下代码,我正在尝试 3 种方法(案例)来更新 C# 列表中的第一项(注意:Dump() 是 LINQPad IDE 中的辅助输出方法)。我希望能解释一下为什么案例 2 没有成功更新列表,而案例 3 却成功了。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使用以下代码更改了对新对象的引用:

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

此代码运行后,first不再引用列表对象。

尝试将其用于第二种情况:

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

这将设置 的属性,first并且first仍然引用列表项。

于 2013-03-12T05:54:34.763 回答
0

当您将新对象传递给引用对象时

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

您使用新的哈希码生成一个新对象,该对象在集合中被识别。列表没有找到以前的哈希码,因此列表没有更新。//案例 2

但在案例 3 中,您正在替换 object 的实例,从而 list 更新新的哈希

如果 1 您只修改对象的属性并且哈希保持不变

这可能是对您问题的解释

于 2013-03-12T06:15:40.820 回答