Lists getting cleared unexpectedly after assignment [duplicate]

无人久伴 提交于 2021-02-05 12:16:19

问题


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

I've put some list into that class, than I cleared the list and wrote the count of the list in the class... I would expect that the output should be "1" (as the list in the class contains the letter 's') but instead it writes "0". How is possible, that a.Clear clears even the list in the class? How can I achieve clearing only the list in the Main and the list in the class letting be?


回答1:


Since you are passing a reference instead of the list itself, you will get 0 after clearing your list.

What you have to do is passing to the class a new List containing the other list's values:

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

This way, even if you clear the 'main' list, in your class you'll have 1 as items count.

Hope this helps.




回答2:


List and other classes are reference types. In few words, it means you have an object somewhere in memory and a reference(s) on it.

this.l = l; means you copied the reference to the first list to the class field. So you have one list and two references on it. And when you clear the list via a variable, no matter how you address it after clearing - via a or cl.l. Your single list is cleared already.

If you want to avoid this, you need to create a copy of list in your constructor:

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

I recommend you to read more information about reference types. They are used widely and knowledge about them will give you a good base for programming skills.




回答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");
 }

I think you know, char is value type, but list is reference type.

Even code like this; it would be same.

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


来源:https://stackoverflow.com/questions/53725256/lists-getting-cleared-unexpectedly-after-assignment

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!