Как я могу получить доступ к резервной переменной автоматически реализуемого свойства? - PullRequest
79 голосов
/ 14 сентября 2008

В прошлом мы объявляли свойства как это:

public class MyClass
{
    private int _age;

    public int Age
    {
          get{ return _age;  }
          set{ _age = value; }
    }
}

Теперь мы можем сделать:

public class MyClass
{
    public int Age {get; set;} 
}

Мой вопрос: как я могу получить доступ к закрытой переменной, которая создается автоматически с помощью этой записи?

Я бы предпочел получить доступ к закрытой переменной, а не к общедоступному методу доступа Age. Есть ли запись по умолчанию для доступа к закрытой переменной или это просто невозможно?

Ответы [ 6 ]

92 голосов
/ 14 сентября 2008

Целью новых автоматических свойств является уменьшение количества шаблонного кода, который вам нужно написать, когда у вас просто есть простое свойство, которое не нуждается в какой-либо специальной логике в get или set.

Если вы хотите получить доступ к закрытому члену, который используют эти свойства, обычно это происходит по нескольким причинам:

  • Вам нужно больше, чем просто получить / установить - в этом случае вам следует просто избегать использования автоматических свойств для этого члена.
  • Вы хотите избежать снижения производительности при прохождении get или set и просто использовать член напрямую - в этом случае я был бы удивлен, если бы действительно было снижение производительности. Простые члены get / set очень легко встроить, и в моем (по общему признанию ограниченном) тестировании я не обнаружил разницы между использованием автоматических свойств и непосредственным доступом к члену.
  • Вы хотите иметь только публичный доступ на чтение (то есть просто 'get') и запись класса в член напрямую - в этом случае вы можете использовать закрытый набор в своем автоматическом свойстве. т.е.

    public class MyClass
    {
        public int Age {get; private set;} 
    }

Это обычно охватывает большинство причин, по которым вы хотите напрямую получить доступ к вспомогательному полю, используемому автоматическими свойствами.

23 голосов
/ 14 сентября 2008

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

Не используйте автоматические свойства, если у вас есть сложная логика в вашем классе. Просто зайдите private int _age и обычные геттеры / сеттеры, как обычно.

IMO, автоматические свойства больше подходят для быстрой реализации одноразовых объектов или временных капсул данных, таких как:

public class TempMessage {
    public int FromID { get; set; }
    public int ToID { get; set; }
    public string Message { get; set; }
}

Там, где вам не нужно много логики.

12 голосов
/ 14 сентября 2008

Этот синтаксис обычно называют «синтаксическим сахаром», что означает, что компилятор берет этот синтаксис и переводит его во что-то еще. В вашем примере компилятор сгенерирует код, который выглядит примерно так:

[CompilerGenerated]
private int <Age>k_BackingField;

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }

Даже зная все это, вы могли бы , вероятно, получить прямой доступ к вспомогательному полю, но такого рода поражение цели использования автоматических свойств невозможно. Я говорю, вероятно, здесь, потому что вы зависите от деталей реализации, которые могут измениться в любой момент в будущем выпуске компилятора C #.

10 голосов
/ 14 сентября 2008

За сценой происходит внедрение закрытой переменной-члена с префиксом <> k__AutomaticsGeneratedPropertyField #

С C # 3.0 Объяснение автоматических свойств

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

7 голосов
/ 15 сентября 2008

Вы не должны, и вряд ли вам это нужно. Если вам нужно получить доступ к свойству, просто используйте публичную собственность (например, this.Age). В частном поле, поддерживающем публичную собственность, нет ничего особенного, использование его в качестве предпочтения по отношению к свойству - просто суеверие.

2 голосов
/ 14 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...