如何用直接实例分配替换列表项

本文关键字:替换 列表 分配 实例 何用直 | 更新日期: 2023-09-27 18:03:21

我有以下代码,我正在尝试3种方法(案例)来更新c#列表中的第一项(注意:Dump()是LINQPad IDE中的helper输出方法)。我希望你能解释为什么案例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;
}

如何用直接实例分配替换列表项

第二种情况不起作用,因为您使用以下代码将first的引用更改为新对象:

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

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

尝试在第二种情况下使用:

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

这将设置first的属性,而first仍然指向列表项。

向引用对象传递新对象

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

生成一个具有新哈希码的新对象,该对象根据该哈希码在集合中进行标识。列表没有找到之前的hascode,因此列表没有更新。//case 2

但是在情况3中,你替换了object的实例,因此list更新了新的哈希值

在第1种情况下,您只修改对象的属性,哈希值保持不变

可能这就是你的问题的解释