(オブジェクトインスタンスごとに)一度だけ呼び出すことができるスレッドセーフなメソッドを書き込もうとしています。以前に呼び出されたことがある場合は、例外をスローする必要があります。
私は2つの解決策を考え出しました。どちらも正しいですか?そうでない場合、それらの何が問題になっていますか?
と
lock
:public void Foo() { lock (fooLock) { if (fooCalled) throw new InvalidOperationException(); fooCalled = true; } … } private object fooLock = new object(); private bool fooCalled;
-
public void Foo() { if (Interlocked.CompareExchange(ref fooCalled, 1, 0) == 1) throw new InvalidOperationException(); … } private int fooCalled;
私が間違っていなければ、このソリューションにはロックフリーであるという利点があり(私の場合は無関係のようです)、必要なプライベートフィールドが少なくて済みます。
また、どの解決策を優先すべきかについての正当な意見や、より良い方法がある場合はさらに提案することもできます。