简单问题:
静态变量是class instance variable
还是class variable
碱基?
知道class instance variable
是为每个定义的类和子类定义的变量。
class variable
是所有子类的全局变量,它定义包含它自己。
答案 0 :(得分:9)
答案 1 :(得分:4)
静态变量的范围限定为给定AppDomain
中定义的类型。它们也在线程之间共享,除非您使用ThreadStaticAttribute
,此时它们变为 每 线程。
类成员显然是作用于类的实例,但不是派生类的“全局”。根据访问修饰符,成员可能对派生实例可见。
具有泛型参数的类具有每个封闭泛型类型的静态变量:
class MyClass<T>
{
public static string Name;
}
因此MyClass<int>
将拥有自己的Name
副本,而MyClass<string>
会有不同的副本。
看看你的答案选择,你觉得每个派生类需要一个静态变量吗?
您可以欺骗并使用上面的泛型规则:
class Program
{
static void Main(string[] args)
{
Derived1.WhatClassAmI = "Derived1";
Derived2.WhatClassAmI = "Derived2";
Console.WriteLine(Derived1.WhatClassAmI); // "Derived1"
Console.WriteLine(Derived2.WhatClassAmI); // "Derived2"
Console.WriteLine(BaseClass<Derived1>.WhatClassAmI); // "Derived1"
Console.WriteLine(BaseClass<Derived2>.WhatClassAmI); // "Derived2"
Console.Read();
}
class BaseClass<T> where T : BaseClass<T>
{
public static string WhatClassAmI = "BaseClass";
}
class Derived1 : BaseClass<Derived1>
{
}
class Derived2 : BaseClass<Derived2>
{
}
}
他们使用“相同”的静态,但由于类型闭包,每个都有自己的值。
答案 2 :(得分:1)
它们是类变量。 在C#中没有像Smalltalk类实例变量那样的东西。即没有办法定义一个在所有类的实例中都是通用的变量,但是它的子类具有不同的值。
要获得“类似”的行为,但缺点是只有在创建了类的实例后才能访问类实例var,我做了类似的事情:
public class BaseClass
{
private static Dictionary<Type, object> ClassInstVarsDict = new Dictionary<Type, object>();
public object ClassInstVar
{
get
{
object result;
if (ClassInstVarsDict.TryGetValue(this.GetType(), out result))
return result;
else
return null;
}
set
{
ClassInstVarsDict[this.GetType()] = value;
}
}
}
public class DerivedClass1 : BaseClass
{
}
public class DerivedClass2 : BaseClass
{
}