3

简单的问题:

静态变量是存在class instance variable还是class variable基础?

知道这class instance variable是为定义它的每个类和子类定义的变量。并且class variable是对定义它的所有子类(包括其自身)都是全局的变量。

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

4

3 回答 3

9

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

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

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

于 2012-05-24T08:59:01.033 回答
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>
    {
    }
}

它们使用“相同”的静态,但由于类型闭包,每个都有自己的值。

于 2012-05-24T09:01:24.177 回答
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
{
}
于 2012-05-24T09:00:26.220 回答