C#並行辞書、特に署名。。。
public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
。。。valueFactoryが複数回呼び出される可能性があることを私は知っています。しかし、複数の戻り値はどうなりますか?ディクショナリにマップされる結果は1つだけであることが保証されていますか、それとも他のスレッドがディクショナリ内の異なる値を表示できるウィンドウがある可能性はありますか?
C#並行辞書、特に署名。。。
public TValue GetOrAdd(TKey key, Func<TKey, TValue> valueFactory)
。。。valueFactoryが複数回呼び出される可能性があることを私は知っています。しかし、複数の戻り値はどうなりますか?ディクショナリにマップされる結果は1つだけであることが保証されていますか、それとも他のスレッドがディクショナリ内の異なる値を表示できるウィンドウがある可能性はありますか?
リフレクターを見ると、valueFactoryは、デリゲートではなく値を受け入れる内部メソッドのためにのみ実行されます。その後、私が理解できないように、それは、デリゲートではなく値を受け入れるレギュラーオーバーロードを呼び出したかのようです。
したがって、基本的に、デリゲートからの値は無視され、ディクショナリにマップされません。ディクショナリの値は常に同じであり、そのようなスレッドは常に同じ値を参照します(GetOrAddを使用すると、1つの値のみがマップされるため)。
明らかに、AddOrUpdateを使用して値を変更すると、値が更新されます。