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

C# 如何用直接实例分配替换列表项,c#,list,C#,List,我有以下代码,其中我尝试了3种方法(案例)来更新C#list中的第一项(注意:Dump()是LINQPad IDE中的一个助手输出方法)。请解释为什么案例2未能成功更新清单,而案例3却成功更新清单,我将不胜感激。first和list[0]都是对列表中第一项的引用,当分配了直接引用时,它们的行为应该是等效的。显然不是 void Main() { Person first = null; List<Person> list = CreateList(out first); //Cas

我有以下代码,其中我尝试了3种方法(案例)来更新C#list中的第一项(注意: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;
}
void Main()
{
第一人称=空;
列表=CreateList(先出);
//案例1
//这将更新列表
first.fname=“第三”;
list.Dump();//输出第三,第二
//案例2
//这不会更新列表
list=CreateList(先出);
first=新人(){fname=“Third”};
list.Dump();//第一个输出,第二个输出
//案例3
//这将更新列表
list=CreateList(先出);
列表[0]=newperson(){fname=“Third”};
list.Dump();//输出第三,第二
}
列表CreateList(先出人员)
{
变量列表=新列表
{
新人(){fname=“First”,lname=“”},
新人(){fname=“Second”,lname=”“}
};
first=list.Find(x=>x.fname==“first”);
退货清单;
}
//在此处定义其他方法和类
班主任
{
公共字符串fname;
公共字符串名称;
}

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

first= new Person() { fname="Third"};
运行此代码后,第一个将不再引用列表对象

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

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

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

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

first= new Person() { fname="Third"};
您使用新的hashcode生成一个新对象,在集合中根据该hashcode标识该对象。列表找不到以前的hashcode,因此列表不会更新//案例2

但在案例3中,您将替换object的实例,因此list将更新新的哈希

在案例1中,只修改对象的属性,哈希保持不变


也许这是对您问题的解释

谢谢你们两位的回复。