С# Пользовательский геттер/сеттер без частной переменной
Недавно я узнал С#, поэтому, когда я научился писать свойства, меня научили делать так:
public string Name { get; set; }
Свойства Auto великолепны! Но теперь я пытаюсь сделать что-то более сложное, поэтому мне нужно написать пользовательскую пару аксессуаров.
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value }
}
Я знаю, что компилятор делает переменную частного экземпляра в ней темной глубиной, когда вы используете авто, но я испорчен и не хочу, чтобы эта закрытая переменная сидела вокруг, выглядя бессмысленной.
Есть ли способ использовать пользовательские аксессоры без частной переменной?
Ответы
Ответ 1
Свойствам вообще не нужны резервные переменные (поля). Хотя они могут использоваться для инкапсуляции простых полей, вы также можете использовать их для доступа к другим данным.
public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }
или
public string SomeStatus { get { return SomeMethodCall(); } }
Если целью является просто инкапсулировать какое-либо поле с помощью свойства, вам понадобится какое-то поле поддержки, если вы не используете автоматические свойства.
Ответ 2
Нет, я боюсь, что нет. Компилятор достаточно умен, чтобы сделать это для вас автоматически сгенерированными свойствами, но со стандартными свойствами. Я полагаю, что логика, лежащая в основе чего-то подобного, окажется в пути и приносит больше вреда, чем пользы.
Например, что, если я создам свойство, подобное этому...
public int SomeValue
{
get
{
return 0;
}
}
Будет ли компилятор (с функцией, которую вы ищете) создать резервную переменную? Зачем? Это не нужно.
Кроме того, если частное значение не создается до момента компиляции, что вы собираетесь ссылаться в коде:
public string Name {
get { return _Name; }
set { _Name = value }
}
Что такое _Name
? Что делать, если у вас есть другое значение где-то еще называется _Name
? Тогда, что бы компилятор назвать значение подкладочный для этого свойства? Что делать, если мне нужны два значения поддержки? Будет ли компилятор достаточно умен для этого?
public string Name
{
get
{
return string.Format("{0} {1}", _FirstName, _LastName);
}
set
{
// some parsing magic
}
}
Раньше его спрашивали, но я думаю, что ответ будет оставаться "нет" в обозримом будущем.
Авто-свойство является синтаксической стенографией для простого прямого доступа членов. (И я полагаю, что одной из его движущих сил было просто попытаться заставить людей перестать создавать значения public
напрямую.) Свойства могут развиваться по сложности намного дальше этого очень легко, и я лично не хочу, чтобы компилятор пытался выяснить, что Я просто могу просто сказать, что нужно делать.
Ответ 3
Ответ: Нет. Вы не можете явно установить свойство с помощью set. Идея рекурсивного набора. (См. Строки 9 и 7):
Line 1 : public string Name
Line 2 : {
Line 3 : get
Line 4 : {
Line 5 : return FirstName + " " + LastName;
Line 6 : }
Line 7 : set
Line 8 : {
Line 9 : Name = value; // <-- Goes back to Line 7
Line 10 : }
Line 11 : }
Это рекурсия (теоретически). Сбой для меня (Практически).