C# 如何用直接实例分配替换列表项
我有以下代码,其中我尝试了3种方法(案例)来更新C#list中的第一项(注意:Dump()是LINQPad IDE中的一个助手输出方法)。请解释为什么案例2未能成功更新清单,而案例3却成功更新清单,我将不胜感激。first和list[0]都是对列表中第一项的引用,当分配了直接引用时,它们的行为应该是等效的。显然不是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
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中,只修改对象的属性,哈希保持不变
也许这是对您问题的解释谢谢你们两位的回复。