【问题标题】:Lists getting cleared unexpectedly after assignment [duplicate]分配后列表意外清除[重复]
【发布时间】:2019-05-12 12:13:33
【问题描述】:
class ListHolder
{
    public List<char> List;
    public ListHolder(List<char> l)
    {
        this.List = l;
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<char> a = new List<char>();
        a.Add('s');
        ListHolder c = new ListHolder(a);
        a.Clear();
        Console.WriteLine(c.List.Count);
    }
}

我已经在该类中添加了一些列表,然后我清除了列表并在类中写入了列表的计数...我希望输出应该是“1”(因为类中的列表包含字母's'),而是写“0”。怎么可能, a.Clear 甚至清除了班级中的列表?如何实现只清除 Main 中的列表和类中的列表?

【问题讨论】:

  • 正确,您将 REFERENCE 传递给列表。
  • 因为参考和价值(阅读这个:stackoverflow.com/questions/23107941/…
  • c 不包含新列表,它包含对原始列表a 的引用,因此在a 上调用Clear 也会清除cl 中的列表,因为它们是同样的事情
  • 当您通过任何变量更新列表时引用它,此更改将反映在所有引用中。
  • 我建议你阅读reference types

标签: c# list class


【解决方案1】:

由于您传递的是引用而不是列表本身,因此您将在清除列表后得到 0。

你要做的就是向类传递一个新的List,其中包含另一个列表的值:

cl c = new cl(new List<char>(a)); 

这样,即使您清除了“主”列表,在您的班级中,您的项目数也会为 1。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    列表和其他类是引用类型。简而言之,这意味着您在内存中的某处有一个对象,并且上面有一个引用。

    this.l = l; 表示您将对第一个列表的引用复制到类字段。所以你有一个列表和两个引用。当您通过a 变量清除列表时,无论您在清除后如何处理它 - 通过acl.l。您的单个列表已被清除。

    如果你想避免这种情况,你需要在你的构造函数中创建一个 list 的副本:

    public cl(List<char> l)
        {
            this.l = new List<char>();
            this.l.AddRange(l);
        }
    }
    

    我建议您阅读有关引用类型的更多信息。它们被广泛使用,有关它们的知识将为您提供良好的编程技能基础。

    【讨论】:

      【解决方案3】:
       if (a is System.ValueType)
       {
         //never
          Console.WriteLine("List is value type");
       }
       if ('s' is System.ValueType)
       {
           //always
           Console.WriteLine("char is value type");
       }
      

      我想你知道,char 是值类型,而 list 是引用类型。

      即使是这样的代码;它会是一样的。

      List<char> a = new List<char>();
      a.Add('s');
      List<char> c = a;
      a.Clear();
      Console.WriteLine(c.Count);
      

      【讨论】:

        猜你喜欢
        • 2013-08-21
        • 2016-03-24
        • 2017-01-08
        • 2013-10-19
        • 1970-01-01
        • 2013-04-14
        • 2019-06-08
        相关资源
        最近更新 更多