我有以下代码,我正在尝试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;
}
答案 0 :(得分:0)
第二种情况不起作用,因为您使用以下代码将first
的引用更改为新对象:
first= new Person() { fname="Third"};
此代码运行后,first
不会再次引用列表对象。
尝试将此用于第二种情况:
list = CreateList(out first);
if(first != null)
first.fname="Third";
list.Dump();
这将设置first
的属性,而first
仍然会引用列表项。
答案 1 :(得分:0)
将新对象传递给引用对象
first= new Person() { fname="Third"};
使用新的哈希码生成一个新对象,在该哈希码上集合中标识该对象。该列表未找到先前的hascode,因此列表未更新.//case 2
但在案例3中,您正在替换对象的实例,从而列出更新新哈希
在案例1中,您只修改对象的属性并且哈希保持不变
可能是您的问题的解释