3

オブジェクトを同じ型にキャストするパフォーマンスに関する質問 (最初は奇妙に聞こえるかもしれませんが、文脈に入れさせてください)

public T Get<T>(string key) where T : class
{
     var objToReturn = (T)_cache[key];
     if (objToReturn != null)
     {
         return objToReturn;
     }
     return null;
}

上記は、型が呼び出し元によって厳密に型指定されている からT型のオブジェクトを取得しようとするコードのスニペットです。CacheObject

オブジェクトの型が強く型付けされていることを知っているので、次の行について疑問に思っています。

var objToReturn = (T)_chache[key];

これは実際にキャストを呼び出し、キャッシュ内のインスタンスを別のインスタンスに変換してそれを返しますか、それとも型が単純に無視されたキャストと同じであることがわかります。

キャストする機能は、このキャッシュが派生型を取得するために使用されているアプリケーションの後の開発に役立つのでお願いしますが、パフォーマンスが大幅に低下する可能性がある早い段階で繁殖したくありません。

想いと感謝。

4

1 に答える 1

4

あなたが示したキャストは、「自然な」参照型キャストです。オブジェクトについては何も変更しません。オブジェクトが適切なタイプ (キャスト先またはサブクラス) であることを確認するだけです。オブジェクトの型が間違っている場合、例外がスローされます。余分なオブジェクトなどは作成されません。

もちろん無料ではありませんが、これがパフォーマンスのボトルネックになることはめったにありません。

ただし、このコードを取得した理由は明らかではありません。

if (objToReturn != null)
{
    return objToReturn;
}
return null;

なぜ使用しないのですか:

return objToReturn;

? それはまったく同じように動作します。次に、メソッド全体を次のように減らすことができます。

public T Get<T>(string key) where T : class
{
    return (T) _cache[key];
}

編集:間違った型の値を黙って として返すことが本当に必要でない限り、代わりに使用するべきではないことに注意してください。例えば:asnull

cache[key] = new object();
string x = cache[key] as string; // x is null
string y = (string) cache[key]; // Exception
于 2013-04-08T14:25:05.570 に答える