2

如果我有

abstract class Base<TSub>
{
    protected static List<TSub> MyStaticList;
}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{

}

我得到两个独立的 MyStaticList 变量,每个基类一个。如果相反,基地看起来像这样

class Base<TSub>
{
    protected static List<string> MyStaticList;
}

即,没有使用模板参数,我是否保证仍然获得两个独立的 MyStaticList 变量?

availableValues()(对于自定义的类 Enum 类层次结构的方法,我需要这个。)

4

2 回答 2

5

具有不同类型参数的泛型类的两个实例化将产生两个独立的类,每个类都有自己的一组静态变量。所以答案是肯定的,静态变量Base<ClassA>.MyStaticListBase<ClassB>.MyStaticList将是独立的。

如果您想要相反的行为(即所有泛型类共享相同的静态变量)将变量声明移动到非泛型类中,并使其成为泛型的基类,如下所示:

public class BaseOfGeneric {
    protected static List<string> MyStaticList;
}
abstract class Base<TSub> : BaseOfGeneric 
{
    ...
}

现在所有实例都Base<T>将共享相同的MyStaticList,而不管它们的类型参数如何。

于 2012-10-22T13:36:04.270 回答
2

http://blogs.msdn.com/b/gusperez/archive/2005/08/09/449363.aspx

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

编辑在 C# 中的通用列表和静态变量行为 之前提出了一个非常相似的问题

您必须使用完全静态的构造才能在泛型类中使用。也许像...

protected static List<TSub> MyStaticList = BaseUtil.MyStaticList
于 2012-10-22T13:35:40.053 回答