Подтвердить что ты не робот

С# Пользовательский геттер/сеттер без частной переменной

Недавно я узнал С#, поэтому, когда я научился писать свойства, меня научили делать так:

public string Name { get; set; }

Свойства Auto великолепны! Но теперь я пытаюсь сделать что-то более сложное, поэтому мне нужно написать пользовательскую пару аксессуаров.

private string _Name;
public string Name {
    get { return _Name; }
    set { _Name = value }
}

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

Есть ли способ использовать пользовательские аксессоры без частной переменной?

4b9b3361

Ответ 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 :   }

Это рекурсия (теоретически). Сбой для меня (Практически).