2

私が持っている場合

abstract class Base<TSub>
{
    protected static List<TSub> MyStaticList;
}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{

}

基本クラスごとに 1 つずつ、2 つの独立した MyStaticList 変数を取得します。代わりにベースがこのように見える場合

class Base<TSub>
{
    protected static List<string> MyStaticList;
}

つまり、テンプレート パラメーターはどこにも使用されていません。2 つの独立した MyStaticList 変数を引き続き取得することは保証されていますか?

availableValues()(これは、カスタマイズされた Enum のようなクラス階層のメソッドに必要です。)

4

2 に答える 2

5

異なる型パラメーターを持つジェネリック クラスの 2 つのインスタンス化は、それぞれ独自の静的変数のセットを持つ 2 つの独立したクラスになります。したがって、答えはイエスです。静的変数は独立しBase<ClassA>.MyStaticListています。Base<ClassB>.MyStaticList

反対の動作 (つまり、すべてのジェネリック クラスが同じ静的変数を共有する) が必要な場合は、変数宣言を非ジェネリック クラスに移動し、次のようにジェネリックの基底クラスにします。

public class BaseOfGeneric {
    protected static List<string> MyStaticList;
}
abstract class Base<TSub> : BaseOfGeneric 
{
    ...
}

のすべてのインスタンスは、型パラメーターに関係なくBase<T>、同じ を共有します。MyStaticList

于 2012-10-22T13:36:04.270 に答える
2

http://blogs.msdn.com/b/gusperez/archive/2005/08/09/449363.aspx

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

EDIT 非常によく似た質問が、ジェネリックリストとc#の静的変数の動作の前に尋ねられました

ジェネリック クラス内で使用するには、完全に静的な構造を使用する必要があります。多分何か...

protected static List<TSub> MyStaticList = BaseUtil.MyStaticList
于 2012-10-22T13:35:40.053 に答える