2010-01-21 6 views
2

Учитывая этот класс ...Compiler-Реализована Неизменность в .Net

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 только когда-либо установлен из конструктора и, следовательно, является только для чтения?

ответ

4

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

.field private int64 _id 

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

.field private initonly int64 _id 
2

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

+0

Это немного вводит в заблуждение и на самом деле не отвечает на вопрос. Рассмотрим «противоположную» ситуацию, когда у вас есть поле «private readonly»: компилятор * знает, пытается ли вы установить это поле из любого места, кроме объявления/конструктора, но также нет ничего, что могло бы помешать вам установить его из другого места, используя отражение , Если компилятор может проверить использование 'private readonly' полей, тогда нет (теоретической) причины, по которым он не смог бы проверить использование полей, отличных от 'readonly'. – LukeH

Смежные вопросы