5

次のステートメントを作成することは合法ですか。

if(Cache[CACHE_KEY] == null)
{
    //do something to form cache
}
else
{
    //do something else that uses cache
}

私のプログラムが実際に正しく機能しているかどうか (コンパイルはできますが) は確信が持てず、キャッシュが存在しないかどうか疑問に思っています。

4

4 に答える 4

6

はい、それは合法です (ただし、タイトルの質問は合法ではありません。詳細については以下を参照してください)。

ただし、次のように、このチェックを 2 回行うよりも、キャッシュ内の型が期待どおりであることを確認する方が賢明な場合があります。

//in English, the following line of code might read:
//    if the item known in the cache by the specified key is in
//    in fact of type MyExpectedReferenceType, then give me it 
//    as such otherwise, give me a null reference instead...
var myCachedInstance = Cache[key] as MyExpectedReferenceType;
if (myCachedInstance == null)
{  
    //we retrieved a reference to an instance of an MyExpectedReferenceType
}
else
{
    //oh, no - we didn't!
}

ただし、質問を読み直して、プログラムが正しく機能していないことを考えると、これよりも大きな問題があると言いたくなります。あなたのプログラムはどのように正しく動作していませんか? Cacheインスタンス自体は、アクセス可能な間は決してありません。nullこれは の読み取り専用フィールドですPage。ただし、予想されるキャッシュ値nullNullReferenceException

アップデート:

コメントに対処するには、コードに追加したコメントを確認してください。

于 2011-04-06T08:42:02.527 に答える
2

投稿したコードには潜在的な競合状態があります。

if(Cache[CACHE_KEY] == null) 
{     
    //do something to form cache 
} 
else 
{     
    // Another thread could have removed CACHE_KEY from the Cache before you get here

}

最初にキャッシュからオブジェクトを抽出してから、null をテストすることをお勧めします。次に例を示します。

MyObject cachedObject = Cache[CACHE_KEY] as MyObject;
// or MyObject cachedObject = (MyObject) Cache[CACHE_KEY]; if you know it is of type MyObject
if(cachedObject == null) 
{     
    cachedObject = ... // generate the cached object
    Cache.Insert(CACHE_KEY, cachedObject, ...);
} 

// use cachedObject
于 2011-04-06T11:01:57.823 に答える
2

非常に合法です。むしろ、アクションを実行する前に値を確認することをお勧めします。特に、キーがスライドアウトしたり、期限切れになったりしていないことを確認してください。

于 2011-04-06T08:39:35.290 に答える
0

はい、可能です。キャッシュは常に初期化されます (セッションおよびアプリケーション obj のように)。しかし、キャッシュ内のキーが null かどうかを確認できます。

于 2011-04-06T08:41:15.417 に答える