1

ジェネリック型が型の組み合わせごとに静的フィールドの個別のインスタンスを作成することを考えると、これは、すべての型にわたって静的フィールドを持ちたい場合に使用する有効なパターンですか?

public class BaseClass
{
    public static int P = 0;
}

public class ChildClass<T> : BaseClass
{
    public static int Q = 0;

    public void Inc()
    {
        // ChildClass<int> will have a different "Q" than ChildClass<double> 
        Interlocked.Increment(ref Q); 
        // all types of ChildClass will increment the same P
        Interlocked.Increment(ref P); 
    }
}

このアプローチで危険なことはありますか? 私のおもちゃの例は機能しますが、恐ろしい副作用やスレッドの結果などがないことを確認したかっただけです:)

4

2 に答える 2

4

Interlocked.Incrementを使用すると、よりスレッド セーフなコードを作成できます。

public void Inc()
{
    Interlocked.Increment(ref Q); // ChildClass<int> will have a different "Q" than ChildClass<double> 
    Interlocked.Increment(ref P); // all types of ChildClass will increment the same P
}

または普通の古いlock

public class BaseClass
{
    protected static int P = 0;
    protected static object pLock = new object();
}

public class ChildClass<T> : BaseClass
{
    private static int Q = 0;
    private static object qLock = new object();

    public void Inc()
    {
        lock(qLock)
        {
            qLock++;
        }

        lock(pLock)
        {
            qLock++;
        }
    }
}

ごとTに異なるものがあることにChildClass<T>.Q注意してくださいBaseClass.P。つまり、 and を処理するために個別のロック オブジェクトを使用する必要がありQますP(技術的には、ロックするために使用するものはPすべて、すべてをロックするためにも使用できますQが、それはおそらくやりたいことではありません)。

于 2013-03-21T23:55:32.200 に答える
2

あなたのパターンは有効で、問題はありません。静的継承のようなものはありませんが、通常と同じように任意の型の静的メンバーにアクセスできます (ただし、派生クラスから可視である場合、たとえば ではありませんprivate)。

BaseClass.P = 10;
ChildClass<string>.Q = 20;

C# の仕様では、32 ビット整数 (つまりint) に対する単一の読み取りまたは書き込みはアトミックであると規定されています。つまり、それらは単一の命令内で完了することができ、半分書き込まれた変数が別のスレッドから見えることは決してありません。

12.5 変数参照の原子性

bool、char、byte、sbyte、short、ushort、uint、int、float、および参照型のデータ型の読み取りと書き込みはアトミックである必要があります。さらに、前のリストの基になる型を持つ列挙型の読み取りと書き込みもアトミックである必要があります。long、ulong、double、decimal などの他の型、およびユーザー定義型の読み取りと書き込みは、アトミックである必要はありません。

もちろん、読み取り書き込みがアトミックであるとは限りません。たとえば、変数の値をインクリメントするには、変数を読み取ってから書き込む必要があり、そこでInterlockedメソッドが機能します。

ところで、静的変数は 1 つしか得られないことに気付いていると思いますがPQ型のさまざまなジェネリック インスタンスと同じ数の静的変数が得られますChildClass<T>

于 2013-03-22T00:02:27.603 に答える