c # Свойство set - зачем использовать закрытую переменную - PullRequest
0 голосов
/ 13 декабря 2011

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

private int _myValue;
public int MyValue { get { return _myValue; } set { _myValue = value; } }

Почему я не могу просто пропустить приватную переменную и сделать это ...

public int MyValue { get { return MyValue; } set { MyValue = value; } }

* Примечание: я не хотел использовать авто свойства, потому что надеялся сделать что-то подобное.

public int MyValue { get { return MyValue.Tolower().Trim(); } set { MyValue = value; } }

Ответы [ 6 ]

15 голосов
/ 13 декабря 2011

Поскольку бесконечный цикл в конечном итоге вызовет исключение StackOverflowException.

5 голосов
/ 13 декабря 2011

Потому что без переменной вы получите бесконечную рекурсию , что приведет к переполнению стека : -)

public int MyValue
{
    get { return MyValue; }
    set { MyValue = value; }
}  

Таким образом, вам необходимо поле поддержки . Причина сохранения поля поддержки private состоит в том, чтобы скрыть детали реализации . Если бы оно было публичным, не имело бы смысла объявлять свойство для доступа к нему.

2 голосов
/ 13 декабря 2011

Почему я не могу просто пропустить приватную переменную и сделать это ...

   public int MyValue { get { return MyValue; } set { MyValue = value; } }

Поскольку return MyValue будет рекурсивно вызывать метод доступа get MyValue свойство, приводящее к бесконечной рекурсии, и в конечном итоге StackOverflowException (и аналогично MyValue = value будет делать то же самое с аксессором set)

0 голосов
/ 13 декабря 2011

В дополнение к ответу Ians они позволяют инициализировать свойство значением по умолчанию по вашему выбору, а не null:

private string _myString = string.Empty;

public string MyString
{
     get{ return _myString;}
     set{ _myString = value;}
}

вернет string.Empty, а не null, если метод set никогда не вызывался.

0 голосов
/ 13 декабря 2011

Как уже говорилось ранее, это может вызвать переполнение стека, причина этого в том, что когда вы наберете MyValue = значение, вы будете вызывать набор снова в бесконечном цикле, пока программа не исчерпает пространство стека, и то же самое произойдет для получить.

public int MyValue { get { return MyValue; } set { MyValue = value; } }
0 голосов
/ 13 декабря 2011

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

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