Внедренная компилятором неизменность в .Net - PullRequest
2 голосов
/ 21 января 2010

Учитывая этот класс ...

public class Test
{
  private long _id;

  public Test(long id)
  {
    _id = id;
  }
}

Будет ли компилятор .Net фактически скомпилировать его как ...

public class Test
{
  private readonly long _id;

  public Test(long id)
  {
    _id = id;
  }
}

Другими словами, понимает ли он, что _id устанавливается только из конструктора и, следовательно, только для чтения?

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Нет, компилятор этого не делает. Код IL для поля будет выглядеть следующим образом:

.field private int64 _id

... в то время как версия только для чтения получит этот код IL:

.field private initonly int64 _id
2 голосов
/ 21 января 2010

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

...