Static fields in a base class and derived classes
static
members are entirely specific to the declaring class; subclasses do not get separate copies. The only exception here is generics; if an open generic type declares static fields, the field is specific to that exact combination of type arguments that make up the closed generic type; i.e. Foo<int>
would have separate static fields to Foo<string>
, assuming the fields are defined on Foo<T>
.
As pointed out in other answer, the base class static field will be shared between all the subclasses. If you need a separate copy for each final subclass, you can use a static dictionary with a subclass name as a key:
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;
}
}