分配后意外清除列表

时间:2018-12-11 13:34:29

标签: c# list class

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中的列表和class类中的列表?

3 个答案:

答案 0 :(得分:0)

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

您要做的是将包含其他列表值的新List传递给类:

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

通过这种方式,即使您清除了“主要”列表,在您的班级中,项目计数也将为1。

希望这会有所帮助。

答案 1 :(得分:0)

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

this.l = l;意味着您将对第一个列表的引用复制到了class字段。因此,您具有一个列表和两个引用。而且,当您通过a变量清除列表时,无论清除后如何寻址(通过acl.l)。您的单个列表已被清除。

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

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

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

答案 2 :(得分:0)

 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);