基类和派生类中的静态字段

Xaq*_*ron 42 c# static scope

abstract基类中,如果我们有一些static字段,那么它们会发生什么?

它们的范围是从这个基类继承的类,还是从它继承的类型(每个子类都有自己staticabstract基类副本)?

Mar*_*ell 67

static成员完全专注于宣布班级; 子类不会获得单独的副本.这里唯一的例外是泛型; 如果开放泛型类型声明静态字段,则该字段特定于组成闭合泛型类型的类型参数的确切组合 ; 即假定已定义Foo<int>字段Foo<string>,即将具有单独的静态字段Foo<T>.

  • 如何从`基类'为所有实例(每种类型)声明一个唯一变量? (3认同)
  • @Marc Gravell:甚至*更多*迂腐,它是casp**e**rOne,而不是casp**a**rOne =) (2认同)

C-F*_*C-F 11

正如其他答案所指出的,基类静态字段将在所有子类之间共享.如果每个最终子类都需要单独的副本,则可以使用具有子类名称的静态字典作为键:

class Base
{
    private static Dictionary<string, int> myStaticFieldDict = new Dictionary<string, int>();

    public int MyStaticField
    {
        get
        {
            return myStaticFieldDict.ContainsKey(this.GetType().Name)
                   ? myStaticFieldDict[this.GetType().Name]
                   : default(int);
        }

        set
        {
            myStaticFieldDict[this.GetType().Name] = value;
        }
    }

    void MyMethod()
    {
        MyStaticField = 42;
    }
}
Run Code Online (Sandbox Code Playgroud)