这可能是一个非常的菜鸟问题,但我无法完全理解为什么我能够将项目添加到我的列表中,为什么我不能将它设置为null?
public class Test
{
public List<string> Source { get; set; }
public Test()
{ this.Source = new[] { "Hey", "hO" }.ToList(); }
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
ModifyList(test.Source);
//Why here test.Source.Count() == 3 ? Why isn't it null ?
}
private static void ModifyList(List<string> list)
{
list.Add("Three");
list = null;
}
}
为什么在调用ModifyList之后,test.Source.Count()== 3?为什么不是空?
我原本希望列表为NULL或保持不变,有两个元素。
有人可以向我解释发生了什么吗? 非常感谢你!
答案 0 :(得分:4)
这是一种C#行为。您将list
设置为指向null
,而不是原始列表。
您应该使用ref
关键字来修改原始变量。
class Program
{
static void Main(string[] args)
{
Test test = new Test();
ModifyList(ref test.Source);
//Why here test.Source.Count() == 3 ? Why isn't it null ?
}
private static void ModifyList(ref List<string> list)
{
list.Add("Three");
list = null;
}
}
答案 1 :(得分:3)
在这种方法中,
private static void ModifyList(List<string> list)
list
参数是按值传递的引用。您正在添加到引用的List,这是正常操作。然后将by-valye副本设置为null
。但原始参考文献(test.Source
)保持不变。
在您的所有代码中,只有一个List<string>
实例,但有多个引用在不同时间指向它。
答案 2 :(得分:1)
通过执行list = null;
,您可以为本地标识list
分配新值。您不能更改(删除)先前存储在其中的对象。