2013-02-07 7 views
12

私はジェネリッククラスを持っている:静的メンバー変数は、すべてのC#汎用インスタンシエーションで共通ですか? C#ので

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

今C++で、私は異なるパラメータでテンプレートクラスをインスタンス化する場合は、それぞれの完全なクラスは、それはVariable自身だになるだろう、C++でとてもI just can't say

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

、私はC#でそうすることができるようです。私は、静的メンバ変数を持つジェネリックを持っている場合は...

を明確にしたいと思います

は、変数は、すべての一般的なインスタンス間で共有されていることがありますか?

答えて

12

Section 25.1.4 of the ECMA C# Language specification

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

あなたはこのブログの記事が表示されることがありますStatic fields in generic classes

Gus Perezによってあなたはその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 
    } 
} 
2

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

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

Variable静的メンバーのある非汎用MyGenericクラスがないことを確認してください。

2

いいえ、そうではありません。一般的なタイプは「開く」または「閉じた」ことができます。オープン型はList<T>のようなもので、typeパラメータは定義されていません。 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; 
} 
6
MyGeneric<MyClass>.Variable 
MyGeneric<MyOther>.Variable 

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

関連する問題