15

C# にはジェネリック クラスがあります。

public class MyGeneric<ParameterClass> where ParameterClass: MyGenericParameterClass, new() {
    public static int Variable;
}

C++ では、テンプレート化されたクラスを異なるパラメーターでインスタンス化すると、完全なクラスごとに独自の が取得されるVariableため、言うことはできません

MyGeneric.Variable = 1; // invalid in C++

C++ ですが、C# でもできるようです。

明確にしたいのですが...

静的メンバー変数を持つジェネリックがある場合、その変数はすべてのジェネリック インスタンス間で共有されますか?

4

5 に答える 5

17

ECMA C#言語仕様のセクション25.1.4

ジェネリッククラス宣言の静的変数は、同じ閉じた構築型(§26.5.2)のすべてのインスタンス間で共有されますが、異なる閉じた構築型のインスタンス間では共有されません。 これらの規則は、静的変数の型に型パラメーターが含まれるかどうかに関係なく適用されます。

あなたはこのブログ投稿を見るかもしれません:GusPerezによるジェネリッククラスの静的フィールド

C#でもそれを行うことはできません。

MyGeneric.Variable = 1;

ECMA言語仕様の次の例を検討してください。

class C<V>
{
    static int count = 0;
    public C()
    {
        count++;
    }
    public static int Count
    {
        get { return count; }
    }
}
class Application
{
    static void Main()
    {
        C<int> x1 = new C<int>();
        Console.WriteLine(C<int>.Count);  // Prints 1 
        C<double> x2 = new C<double>();
        Console.WriteLine(C<double>.Count); // Prints 1 
        Console.WriteLine(C<int>.Count);  // Prints 1 
        C<int> x3 = new C<int>();
        Console.WriteLine(C<int>.Count);  // Prints 2 
    }
}
于 2013-02-07T10:27:43.617 に答える
7
MyGeneric<MyClass>.Variable
MyGeneric<MyOther>.Variable

これら 2 つは、別々のクラスのように扱われる異なる静的変数です。

于 2013-02-07T10:23:01.773 に答える
3

いいえそうではありません。ジェネリック型は、「オープン」または「クローズ」にすることができます。オープン型はList<T>、型パラメーターが定義されていないようなものです。List<int>密閉型です。

基本的に、オープン タイプはランタイムによって適切な「タイプ」として扱われません。クローズ バージョンのみが真のタイプです。したがって、MyGeneric<int>MyGeneric<string>は 2 つのまったく異なる型であるため、静的変数の独自のインスタンスがあります。

これは、提案した方法で静的メンバーを呼び出すことができないという事実によってより明白になりますMyGeneric.Variable。C# ではコンパイルされません。

このコンソール アプリケーション コードは、それを非常に簡単に示しています。

class Program
{
    static void Main(string[] args)
    {
        Test<int>.i = 2;
        Test<string>.i = 8;

        Console.WriteLine(Test<int>.i);   // would write "8" if the fields were shared
        Console.WriteLine(Test<string>.i);
        // Console.WriteLine(Test.i); // does not compile
        // Console.WriteLine(Test<>.i); // does not compile
    }
}

class Test<T>
{
    public static int i;
}
于 2013-02-07T10:22:15.843 に答える
2

いいえ、共有されません。

MyGeneric<T>クラスは、可能性ごとに異なるランタイム タイプに解決されますT

静的メンバーを持つ非ジェネリックMyGenericクラスがないことを確認してください。Variable

于 2013-02-07T10:19:55.717 に答える