[解決済み] using文とtry finally文の比較
質問
読み取り/書き込みロックを使用する予定のプロパティの束があります。私は、それらを
try finally
または
using
節を使用します。
では
try finally
の前にロックを取得することになりますね。
try
で解放します。
finally
. で
using
節では、コンストラクタでロックを取得し、Disposeメソッドでロックを解放するクラスを作成します。
私は多くの場所で読み取り/書き込みロックを使用しているため、以下の方法よりも簡潔な方法を探していました。
try finally
. ある方法が推奨されない理由や、ある方法が他の方法よりも優れている理由について、いくつかのアイデアを聞いてみたいと思っています。
方法1 (
try finally
):
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
rwlMyLock_m .AcquireReaderLock(0);
try
{
return dtMyDateTime_m
}
finally
{
rwlMyLock_m .ReleaseReaderLock();
}
}
set
{
rwlMyLock_m .AcquireWriterLock(0);
try
{
dtMyDateTime_m = value;
}
finally
{
rwlMyLock_m .ReleaseWriterLock();
}
}
}
方法2
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock();
private DateTime dtMyDateTime_m
public DateTime MyDateTime
{
get
{
using (new ReadLock(rwlMyLock_m))
{
return dtMyDateTime_m;
}
}
set
{
using (new WriteLock(rwlMyLock_m))
{
dtMyDateTime_m = value;
}
}
}
public class ReadLock : IDisposable
{
private ReaderWriterLock rwl;
public ReadLock(ReaderWriterLock rwl)
{
this.rwl = rwl;
rwl.AcquireReaderLock(0);
}
public void Dispose()
{
rwl.ReleaseReaderLock();
}
}
public class WriteLock : IDisposable
{
private ReaderWriterLock rwl;
public WriteLock(ReaderWriterLock rwl)
{
this.rwl = rwl;
rwl.AcquireWriterLock(0);
}
public void Dispose()
{
rwl.ReleaseWriterLock();
}
}
どのように解決するのですか?
MSDNより。 usingステートメント(C#リファレンス)
<ブロッククオートusingステートメントは、オブジェクトのメソッドを呼び出している間に例外が発生した場合でも、Disposeが呼び出されることを保証します。オブジェクトを try ブロック内に置き、finally ブロック内で Dispose を呼び出すことで同じ結果を得ることができます。実際、これは using 文がコンパイラによって翻訳される方法です。先ほどのコード例は、コンパイル時に次のようなコードに展開されます (オブジェクトの限定的なスコープを作成するために中括弧が追加されていることに注意してください)。
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
ですから、基本的には は同じコードですが、自動的なヌルチェックと変数のための余分なスコープを備えています。 . ドキュメントには、IDisposableオブジェクトの正しい使用を保証するとも書かれています(quot; ensure the correct use of IDisposable object" so you might as well gets even better framework support for any obscure cases in the future.
というわけで、2.を選択します。
変数 がスコープ内にあること の中にあって、それが不要になったらすぐに終了することもプラスです。
関連
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み】空のtryブロックでtry {} finally {}を使用するのはなぜですか?
-
[解決済み】try { return x; } finally { x = null; }文の中で実際に何が起こっているのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] using文の中で例外が発生してもDisposeは呼ばれるのか?