値のキャッシュに使用する場合がいくつかありConcurrentDictionary<TKey, TValue>
ますが、多くの場合、を使用して値をキャッシュに追加するかどうかを決定するために、値の検証を実行する必要がありますConcurrentDictionary<TKey, TValue>.GetOrAdd(TKey, Func<TKey, TValue>)
。
通常、次の線に沿って:
private readonly ConcurrentDictionary<Type, ISomeObject> someObjectCache =
new ConcurrentDictionary<Type, ISomeObject>();
public ISomeObject CreateSomeObject(Type someType)
{
return someObjectCache.GetOrAdd(someType, type =>
{
if(!Attribute.IsDefined(someType, typeof(SomeAttribute))
// Do something here to avoid the instance from being added to
// `someObjectCache`
ISomeObject someObject;
// Typical factory functionality goes here
return someObject;
});
}
今日私がこれを処理する方法は、正常に機能しているように見える例外をスローすることですが、よりクリーンなアプローチ(おそらく、設定できるフラグまたは戻り値を設定できる特定の値)を使用してGetOrAdd
、ラムダ(実際には本格的な方法に置き換えることができますが)。
他のLINQのようなメソッドでの私の経験に基づくと、返すnull
と、そのようにチェックされずに値が追加されることになります(そして、ILを読み取るとGetOrAdd
、同じ問題が発生するように見えます)。動作します。
例外を使用して追加をキャンセルすることを回避できる方法はありGetOrAdd
ますか?