C # Пользовательский геттер / сеттер без приватной переменной - PullRequest
50 голосов
/ 20 декабря 2011

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

public string Name { get; set; }

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

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

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

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

Ответы [ 3 ]

37 голосов
/ 20 декабря 2011

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

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

или

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

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

11 голосов
/ 15 марта 2017

Ответ: Нет, вы не можете сделать это .Это из-за рекурсии.(См. Строки № 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 :   }
10 голосов
/ 20 декабря 2011

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

Например, что если я создам свойство, подобное этому ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...