2

这可能是一个非常菜鸟的问题,但我无法完全理解为什么我能够将项目添加到我的列表中,为什么我不能将其设置为 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 ?

我本来希望该列表要么为 NULL,要么保持不变,但有两个元素。

有人可以向我解释发生了什么吗?非常感谢你!

4

3 回答 3

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;
    }
}
于 2013-09-15T10:36:49.907 回答
3

在这种方法中,

private static void ModifyList(List<string> list)

list参数是按值传递的引用。您正在添加到引用列表,这是正常操作。然后将 by-valye 副本设置为null. 但原始引用 ( test.Source) 保持不变。

在您的所有代码中,只有 1 个实例,List<string>但在不同时间有多个引用指向它。

于 2013-09-15T10:37:23.723 回答
1

通过执行list = null;,您可以为本地标识符分配一个新值list。您不会更改(删除)之前存储在其中的对象。

于 2013-09-15T10:37:02.217 回答