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
类型。
在一般情况下,虽然它涉及更多。 MyList
和MyList
类型实际上是不同的类型。 因此,它们具有彼此独立的单独静态值。
改变了我的答案以反映你的通用问题,你可以做这样的事情,不要认为有一个很好的方法来定义静态计数器的类型。
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
也许你期待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
对象。 由于在打字系统中这些对象之间没有实际连接,因此添加额外私有计数器的其他解决方案将不起作用。 你的柜台必须是外部的。
MyList
和MyList
被编译成严格但单独的类型,这意味着当你调用构造函数时,你将MyList
的静态计数增加两次,然后MyList
的静态计数MyList
一次,因此2,2,1。
结果应该是
3 3 3
你有什么期待?