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

В прошлом мы объявили следующие свойства:

public class MyClass
{
    private int _age;

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

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Если вам не нужна большая логика.

Ответ 3

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

[CompilerGenerated]
private int <Age>k_BackingField;

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

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

Ответ 4

За кулисами происходит то, что происходит при вводе частной переменной-члена, с префиксом < > k__AutomaticallyGeneratedPropertyField #

От Подробные описания свойств С# 3.0

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

Ответ 5

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

Ответ 6

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