C# автоматическое свойство

Автоматическое свойство C# 3.0 полностью заменяет поле?

Я имею в виду, что я могу напрямую использовать свойство вместо поля, так как свойство служит частным вспомогательным полем (извините, я так понимаю, только так).

int a;

public int A
{
  get;set;
 }

3 ответа

Решение

Когда вы обращаетесь к свойству из кода - будь то внутри или вне класса - оно всегда доступно как свойство. В большинстве случаев это неважно, но это означает, что вы не можете передать его по ссылке, что вы могли бы сделать, если бы это было поле.

Единственным фрагментом кода, который напрямую обращается к вспомогательному полю (без отражения), является само свойство.

Это свойство, чистое и простое. Это не доступно как поле - это доступно как собственность. Компилятор C# не заменяет доступ к нему доступом к полю. Доступ к нему - это всегда доступ к свойству. Конечно, это может быть заложено компилятором JIT, но в этом нет ничего особенного. Что касается CLR, то это просто нормальное свойство (которое имеет [CompilerGenerated] атрибут применяется к нему).

Но чтобы ответить на ваш первоначальный вопрос - да, автоматическое свойство означает, что вам не нужно объявлять поле поддержки самостоятельно. По сути, это:

public int Foo { get; set; }

переводится на

private int <>Foo; // Or some other unspeakable name
public int Foo
{
    get { return <>Foo; }
    set { <>Foo = value; }
}

Вы не можете получить доступ к сгенерированному полю непосредственно в коде C#, так как оно имеет неописуемое имя. Вы увидите, что он присутствует, если изучите тип с помощью отражения - CLR не различает автоматически реализованное свойство и "нормальное" свойство.

Да, автоматическое свойство имеет свое собственное поле хранения.

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

Пожалуйста, смотрите это руководство для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/bb384054.aspx

Существует некоторая магия компилятора, такая как с делегатами, и так далее. Вы можете видеть это так, как будто компилятор берет на себя ответственность за создание необходимого кода, который в противном случае вам пришлось бы вводить явно.

Другие вопросы по тегам