静态变量是类实例变量吗?

时间:2012-05-24 08:57:42

标签: c# variables static

简单问题:

静态变量是class instance variable还是class variable碱基?

知道class instance variable是为每个定义的类和子类定义的变量。 class variable是所有子类的全局变量,它定义包含它自己。

编辑:知道我窒息了很多C#-ish guy我正在使用术语类实例,就好像一个类是一个MetaClass的实例。这大大简化了我的问题。虽然如果你认为VM肯定有一个代表evrey类的工件(包含方法dictionay,实例大小,超类,......),这并不是完全错误的。 感谢

3 个答案:

答案 0 :(得分:9)

静态变量“属于”类型 - 它们不是实例变量。

也就是说,它们在类型的所有实例之间共享,包括generic封闭的构造类型。

例外是用ThreadStatic修饰的静态变量,使变量在一个线程中是唯一的。

答案 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
{
}