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

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

public string Name { get; set; }

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

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

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

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

3 ответов


свойства вообще не нуждаются в резервных переменных (полях). Хотя они могут использоваться для инкапсуляции простых полей, вы также можете использовать их для доступа к другим данным.

public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }

или

public string SomeStatus { get { return SomeMethodCall(); } }

Если цель состоит в том, чтобы просто инкапсулировать некоторое поле со свойством, вам понадобится какое-то резервное поле, если вы не используете автоматические свойства.


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

например, что делать, если я создам такое свойство...

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 значений напрямую.) Свойства могут расти в сложности намного дальше этого очень легко, и я лично не хотел бы, чтобы компилятор пытался выяснить, что я могу легко просто сказать ему делать.


ответ Нет, вы не можете сделать это. Это из-за рекурсии. (См. строки 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 :   }