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类中的列表?
答案 0 :(得分:0)
由于传递的是引用而不是列表本身,因此清除列表后将得到0。
您要做的是将包含其他列表值的新List
传递给类:
cl c = new cl(new List<char>(a));
通过这种方式,即使您清除了“主要”列表,在您的班级中,项目计数也将为1。
希望这会有所帮助。
答案 1 :(得分:0)
列表和其他类是引用类型。简而言之,这意味着您在内存中的某个位置有一个对象,并在其上有一个引用。
this.l = l;
意味着您将对第一个列表的引用复制到了class字段。因此,您具有一个列表和两个引用。而且,当您通过a
变量清除列表时,无论清除后如何寻址(通过a
或cl.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);