Как я могу получить доступ к резервной переменной для свойства автообновления?
В прошлом мы объявили следующие свойства:
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 добавила для вас закрытую переменную. Я согласен с тем, что для класса достаточно странно использовать публичную точку входа для доступа к своим переменным. Поэтому я не использую эту новую функцию так много.