c# - 在 C# 中使用静态变量

标签 c# list reference static

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

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
}

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

最佳答案

嗯,是的,你指的是同一个对象,因为 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

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

如果您想存储 a副本list[0] ,然后制作副本:

list.Add(new List<int>(a));

或者使用linq使其更加简洁:

list.Add(a.ToList());

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

关于c# - 在 C# 中使用静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17615089/

相关文章:

c# - 代码忽略了 PrincipalPermission 属性?

c# - 从 OpenFileDialog 处理多个选定的文件

c# - 单击后禁用按钮,同时维护 CausesValidation 和 OnClick-Method

xml - 如何获取所有使用的命名空间的列表?

python - 用 Python 创建科目和评分系统

c# - 如何在不引用数组的情况下更改数组对象?

c# - 使用简单 = 的引用问题不同

c# - 在 WPF 应用程序中存储颜色

python - 字典列表,按列表键无交集

c++ - && 对 C++ 中的参数类型意味着什么?