2010-11-30 3 views
4
我々はコードを知っているよう

読み取り専用フィールドの構文ショートカットが

using(myDisposable) 
{ 
} 

try 
{ 
    //do something with myDisposable 
} 
finally 
{ 
    IDisposable disposable = myDisposable as IDisposable; 
    if(disposable != null) 
    { 
    disposable.Dispose(); 
    } 
} 

lock(_locker) 
{ 
} 

のと同等であるが

Monitor.Enter(_locker); 
try 
{ 

} 
finally 
{ 

    Monitor.Exit(_locker); 
} 
のと同じです3210

readonlyフィールドに相当するものは何ですか?

readonly object _data = new object(); 

答えて

5

読み取り専用のオブジェクトは、readonlyのない初期化と同じです。主な違いは、ILメタデータはinitonlyビットをフィールドに設定することです。

Nitpick:usinglockの拡張はいずれも微妙な点では間違っています。

lockのバージョンは、使用しているCLRおよびC#コンパイラのバージョンによって異なります。 4.0ランタイムと組み合わせたC#4.0コンパイラが代わりにEnter(object, ref bool)パターンを使用して、プレーンEnter(object)

それはあなたが持っている、最終的には

if (disposable != null) { 
    ((IDisposable)disposable).Dispose(); 
} 
+0

ジャレッドをブロックでこれに少し近い見えるのでusingバージョンが微妙に間違っています4.0 CLRのTryEnterパターンへの切り替えに関するリンク(または個人的に展開できますか?) –

+1

@アダム、私は間違った方法を持っていた。これは実際に 'Enter(object、ref bool)'であり、 'TryEnter'ではありません。エリックはこれに関する全面的なブログ投稿とそれが行われた理由をhttp://blogs.msdn.com/b/ericlippert/archive/2009/03/06/locks-and-exceptions-do-not-mix.aspx – JaredPar

+0

+知識に感謝します。私はC#4.0でこれと同等のことを知りませんでした。 – garik

4

1つではありません。つまり、readonlyキーワード以外はreadonlyフィールドを表すことはできません。

キーワードreadonlyは、フィールドがクラスのコンストラクタ内でのみ変更できることをコンパイラに知らせる信号です。

関連する問題