我在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<int> list1 = new MyList<int>();
MyList<int> list2 = new MyList<int>();
MyList<double> list3 = new MyList<double>();
Console.WriteLine(list1.GetCount());
Console.WriteLine(list2.GetCount());
Console.WriteLine(list3.GetCount());
}
}
public class MyList<T>
{
static int _count;
public MyList()
{
_count++;
}
public int GetCount()
{
return _count;
}
}
}
答案 0 :(得分:13)
结果如我所料
2
2
1
泛型类声明中的静态变量在相同的闭合构造类型(第26.5.2节)的所有实例之间共享,但不在不同的闭合构造类型的实例之间共享。无论静态变量的类型是否涉及任何类型参数,这些规则都适用。
答案 1 :(得分:7)
这种方式工作的原因与为单个静态声明生成了多少个值有关。给定AppDomain
中每种类型将有一个静态值。
在非一般情况下,这意味着声明和值之间存在1-1关系。毕竟,给定string
中只有一个AppDomain
类型。
在一般情况下,虽然它涉及更多一点。类型MyList<int>
和MyList<double>
实际上是不同的类型。因此,它们具有彼此独立的单独静态值。
答案 2 :(得分:2)
更改了我的答案以反映您的通用问题,您可以执行类似的操作,不要认为有必要为静态计数器定义类型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication12
{
class Program
{
static void Main(string[] args)
{
MyList<int> list1 = new MyList<int>();
MyList<int> list2 = new MyList<int>();
MyList<double> list3 = new MyList<double>();
Console.WriteLine(list1.GetCount());
Console.WriteLine(list2.GetCount());
Console.WriteLine(list3.GetCount());
}
}
public class MyList<T>
{
private static int _count;
private int _myCount;
public MyList()
{
_myCount = ++MyList<object>._count;
}
public int GetCount()
{
return _myCount;
}
}
}
答案 3 :(得分:1)
也许你期待1,2,3?如果是这样,您需要进行修改:
public class MyList
{
static int _count;
private int myCount;
public MyList()
{
this.myCount = ++_count;
}
public int GetCount()
{
return this.myCount;
}
}
答案 4 :(得分:1)
我有一种感觉,你期待看到
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());
答案 5 :(得分:1)
根据T的类型,每个MyList<T>
对象在AppDomain
内是完全独立的。因此,在您的情况下,您有2个MyList<int>
个对象和1个MyList<double>
个对象。由于在打字系统中这些对象之间没有实际连接,因此添加额外专用计数器的其他解决方案将不起作用。你的柜台必须是外部的。
答案 6 :(得分:1)
MyList<int>
和MyList<double>
被编译为严格但单独的类型,这意味着当您调用构造函数时,您将静态计数增加MyList<int>
两次,然后静态计数{ {1}}一次,因此2,2,1。
答案 7 :(得分:0)
结果应为
3
3
3
你在期待什么?