在C#中使用静态变量

use*_*300 2 c# static reference list

在我的项目中使用静态变量时遇到问题(强制使用静态变量)

public static List<int> a = new List<int>();
public static List<List<int>> list = new List<List<int>>();
public Form1()
{
    for (int i = 0; i < 5;i++ )
        a.Add(i);
    list.Add(a);
    Console.WriteLine(list[0].Count); // **count = 5**
    a.RemoveAt(0);
    list.Add(a);
    Console.WriteLine(list[0].Count); // **count = 4** 
    Console.WriteLine(list[1].Count); // count = 4
}
Run Code Online (Sandbox Code Playgroud)

当我使用时a.RemoveAt(0),它会list[0]改变.为什么这样做,我该如何解决?

Chr*_*air 5

嗯,是的,你指的是同一个对象,因为它List<T>是一个引用类型.请参阅:http://msdn.microsoft.com/en-us/library/s6938f28.aspx

例如:

List<int> a = new List<int>();
List<int> b = a;
Console.WriteLine(Object.ReferenceEquals(a, b)); //true

a.Add(1);
Console.WriteLine(a[0]); //1
Console.WriteLine(b[0]); //1

a[0] = 9000;
Console.WriteLine(a[0]); //9000
Console.WriteLine(b[0]); //9000
Run Code Online (Sandbox Code Playgroud)

在列表中存储列表将产生相同的结果:您指向相同的原始列表.

如果要存储in 的副本,请复制:alist[0]

list.Add(new List<int>(a));
Run Code Online (Sandbox Code Playgroud)

或者使用linq使其更简洁:

list.Add(a.ToList());
Run Code Online (Sandbox Code Playgroud)

(确保using System.Linq;在代码文件的顶部添加指令)