Синтаксический ярлык «Только чтение» - PullRequest
4 голосов
/ 30 ноября 2010

Как мы знаем код:

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);
}

Что эквивалентно readonly полю?

readonly object _data = new object();

Ответы [ 2 ]

5 голосов
/ 30 ноября 2010

Только для чтения объект эквивалентен инициализации без readonly. Основное отличие состоит в том, что метадату IL будет задан бит initonly в поле.

Nitpick: и ваше расширение using и lock неверно в некоторых тонах.

Версия lock неверна, поскольку ее расширение зависит от используемой вами версии компилятора CLR и C #. Компилятор C # 4.0 в сочетании со средой выполнения 4.0 использует шаблон Enter(object, ref bool) вместо простого Enter(object)

Версия using немного неверна, потому что выглядит немного ближе к этому в блоке finally

if (disposable != null) {
  ((IDisposable)disposable).Dispose();
}
4 голосов
/ 30 ноября 2010

Нет ни одного;то есть вы не можете выразить поле readonly, кроме как с помощью ключевого слова readonly.

Ключевое слово readonly является сигналом для компилятора, что поле может быть изменено только внутри конструктора класса.

...