c#中的通用列表和静态变量行为

我在C#中有一个简单的应用程序。 当我运行代码时,我没有得到预期的结果?。我得到2,2,1但我期待1,2,3

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication12 { class Program { static void Main(string[] args) { MyList list1 = new MyList(); MyList list2 = new MyList(); MyList list3 = new MyList(); Console.WriteLine(list1.GetCount()); Console.WriteLine(list2.GetCount()); Console.WriteLine(list3.GetCount()); } } public class MyList { static int _count; public MyList() { _count++; } public int GetCount() { return _count; } } } 

结果如我所料

 2 2 1 

这篇MSDN博客文章告诉我们

generics类声明中的静态变量在相同的闭合构造类型(第26.5.2节)的所有实例之间共享,但不在不同的闭合构造类型的实例之间共享。 无论静态变量的类型是否涉及任何类型参数,这些规则都适用。

这样工作的原因与为单个静态声明生成了多少个值有关。 给定AppDomain每种类型将有一个静态值。

在非通用情况下,这意味着声明和值之间存在1-1关系。 毕竟在给定的AppDomain只有一个string类型。

在一般情况下,虽然它涉及更多。 MyListMyList类型实际上是不同的类型。 因此,它们具有彼此独立的单独静态值。

改变了我的答案以反映你的通用问题,你可以做这样的事情,不要认为有一个很好的方法来定义静态计数器的类型。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication12 { class Program { static void Main(string[] args) { MyList list1 = new MyList(); MyList list2 = new MyList(); MyList list3 = new MyList(); Console.WriteLine(list1.GetCount()); Console.WriteLine(list2.GetCount()); Console.WriteLine(list3.GetCount()); } } public class MyList { private static int _count; private int _myCount; public MyList() { _myCount = ++MyList._count; } public int GetCount() { return _myCount; } } } 

也许你期待1,2,3? 如果是这样,您需要进行修改:

 public class MyList { static int _count; private int myCount; public MyList() { this.myCount = ++_count; } public int GetCount() { return this.myCount; } } 

我有一种你期待看到的感觉

1 2 3

但是你得到了

3 3 3而不是。

以下将给你1 2 3:

  MyList list1 = new MyList(); Console.WriteLine(list1.GetCount()); MyList list2 = new MyList(); Console.WriteLine(list2.GetCount()); MyList list3 = new MyList(); Console.WriteLine(list3.GetCount()); 

每个MyList对象在AppDomain基于T的类型是完全独立的。因此在您的情况下,您有2个MyList对象和1个MyList对象。 由于在打字系统中这些对象之间没有实际连接,因此添加额外私有计数器的其他解决方案将不起作用。 你的柜台必须是外部的。

MyListMyList被编译成严格但单独的类型,这意味着当你调用构造函数时,你将MyList的静态计数增加两次,然后MyList的静态计数MyList一次,因此2,2,1。

结果应该是

 3 3 3 

你有什么期待?