1

どこか思い出せませんが、C# で lock キーワードを使用すると割り当てられることをどこかで読みました。

ValueType をロックしようとすると valuetype がボックス化されることはわかっていますが、他の状況はありますか?

編集::

  1. 誰もが valuetype の場合に答えているようですが、私はすでにこれを知っています!
  2. 私はまた、ロックとは何か、そしてそれらをどのように使用するかを非常に深く知っています.ベストプラクティスに関する一般的なアドバイスは素晴らしいですが、役に立たない;)
  3. xbox に展開する XNA アプリを構築しているため、知っておく必要があります。xbox ガベージ コレクターは非常に遅いです。つまり、割り当てを最小限に抑える必要があり、できれば存在しないようにする必要があります (これにより、コレクターが実行されなくなります)
4

2 に答える 2

1

see sync ブロックの割り当ては内部的に遅延していますが (ただし、これは、Essential.NET の「ボリューム 1」から知っている IIRC の実装の詳細であるか、C# を介した CLR であり、そのように扱われるべきです)。あなたが提案しているようにボックス化する必要があるアイテムは発生しません-なぜlock(<integer var>)が許可されていないのに、Monitor.Enter(<integer var>)が許可されているのかを参照してください?

于 2009-11-30T14:44:28.573 に答える
1

使用を考えていた場合:

ロック(これ)

あなたはあなたのインスタンスを見ているので、あなたのクラスのユーザーもそれをロックしてあなたを台無しにする可能性があることを知っておくべきです. それが問題になるかどうかは、ユーザーが何をするかによって決まります。あなたがやっている場合、同じ状況が存在します:

lock(typeof(MyClass))

これを行いたくない場合は、静的オブジェクトまたはインスタンス オブジェクト (つまり、オブジェクト myLock = new object()) を簡単に割り当てて、それをロックできます。

ソース

参照型と値型のロックに関する限り、取得時にリソースをロックするというこのSO の質問には答えがあります。

タイプによって異なります-参照型の場合ははい、値型の場合はいいえ。これは、値の型がボックス化され、その値をロックしようとすると、実際には別のオブジェクトのロックが取得されるため、決して値の型をロックしてはならない理由でもあります。

ロックステートメントの定義:

lock ステートメント(C# リファレンス)

lock キーワードは、特定のオブジェクトの相互排除ロックを取得し、ステートメントを実行してからロックを解放することにより、ステートメント ブロックをクリティカル セクションとしてマークします。

C# のロック キーワードに関するこのSO の質問が役立つ場合があります。また、なぜ lock() が許可されていないのに、Monitor.Enter() が許可されているのかを確認することもできます。

コンパイラの仕様では、ロックの動作を次のように定義しています。

lock ステートメントの式のコンパイル時の型は、参照型であることが知られている > 型パラメーター (§25.1.1) でなければなりません。式のコンパイル時の型が値型を示すのは、コンパイル時のエラーです。

于 2009-11-30T14:45:52.513 に答える