3

簡単な質問:

静的変数は存在class instance variableまたはclass variableベースですか?

class instance variableそれが定義されているクラスとサブクラスごとに定義されている変数であることを知っています。そしてclass variable、それ自体を含めて定義されているすべてのサブクラスに対してグローバルな変数です。

編集:私が多くのC#っぽい人を窒息させていることを知って、私はあるMetaClassのインスタンスがあるクラスのようにクラスインスタンスという用語を使用しています。これは私の質問を非常に単純化します。VMには確かにevreyクラス(メソッドdictionay、インスタンスサイズ、スーパークラスなどを含む)を表すアーティファクトがあると考えるのは完全に間違っているわけではありません。ありがとう

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 に答える