静态变量是类实例变量

本文关键字:变量 实例 静态 | 更新日期: 2023-09-27 18:35:15

简单的问题:

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

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

编辑:知道我窒息了很多C#式的家伙,我正在使用术语类实例,就好像一个类,其中某个元类的实例。这大大简化了我的问题。尽管如果您认为 VM 肯定有一个代表 evrey 类的工件(包含方法字典、实例大小、超类......谢谢

静态变量是类实例变量

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

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

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

静态变量的作用域为给定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>
    {
    }
}

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

它们是类变量。在 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
{
}