Почему я должен использовать приватную переменную в аксессуре свойств?
Извините Если я ноб, у меня есть это сомнение, почему мы используем частные переменные и устанавливаем их с помощью свойств?
Почему мы не можем просто использовать собственные свойства?
Я говорю о таких ситуациях
private string _testVariable;
public string MyProperty
{
get { return _testVariable;}
set {_testVariable = value;}
}
Я просто хочу использовать
public string MyProperty { get; set; }
Почему избыточная частная переменная? эти две стратегии разные? может кто-нибудь попробует пролить свет на это.
Спасибо
Ответы
Ответ 1
Ваши примеры семантически одинаковы. Синтаксис объявления сжатого свойства (только наличие { get; set; }
) - это ярлык, доступный в С# 3.0. Компилятор фактически создает частную резервную переменную и простой getter и setter, как в вашем первом примере.
Если все, что вы делаете, это создание getter и setter (и ничего не происходит, когда это происходит), то краткий синтаксис является хорошим вариантом. Если вам нужно выполнить какие-либо другие действия (например, перерисовать элемент управления) при установке значения, то требуется полный синтаксис.
Ответ 2
Почему избыточная частная переменная? находятся эти две стратегии разные? Можно кто-нибудь, пожалуйста, пролил свет на это.
Если все, что вы делаете, это чтение/запись переменной, то нет. В противном случае существует две причины, по которым вам нужна приватная переменная:
Проверка данных
// Data validation
public class IntWrapper
{
private int _value;
public int Value
{
get { return _value; }
set
{
if (value < 0) { throw new Exception("Value must be >= 0"); }
_value = value;
}
}
}
Getter/setter обертывает базовое хранилище данных
public class StringBuffer
{
List<char> chars = new List<char>();
// Wraps up an underlying data store
public string Value
{
get { return new String(chars.ToArray()); }
set { chars = new List<char>(value.ToCharArray()); }
}
public void Write(string s) { Write(chars.Count, s); }
public void Write(int index, string s)
{
if (index > chars.Count) { throw new Exception("Out of Range"); }
foreach(char c in s)
{
if (index < chars.Count) { chars[index] = c; }
else { chars.Add(c); }
index++;
}
}
}
Ответ 3
Второй пример, который вы даете:
public string MyProperty { get; set; }
Доступно только в более поздних версиях .Net framework (v3.0 и далее я считаю)
Первый пример позволяет вам установить точки останова в операторах return
и присваиваниях, заставляя ваш отладчик прерываться при назначении/чтении свойства.
Ответ 4
Первый снимок кода позволяет вам изменить состояние частного класса. Обманирование частного состояния в собственности хорошо, потому что оно скрывает реализацию. Позже вы можете изменить реализацию, и свойство (внешний интерфейс) может остаться без изменений.
Например, предположим, что вместо того, чтобы устанавливать одну строчку внутри сеттера, вы устанавливаете строку в каком-то частном хранилище. Вы пишете его в файл или записываете в разделяемую память. Или, может быть, вы вычисляете хэш только строки и не храните его вообще, как вы можете сделать с паролем.
Авто свойства в вашем 2-м кодере не относятся к частной переменной вообще. Конструкция авто-собственности, такая как явный дизайн свойств, используемый в первом сокращении, позволяет в будущем модифицировать. Например, в рамках этой модификации вы можете преобразовать из свойств auto в явно реализованные свойства.
Ответ 5
Mashesh, Мы все должны были где-то начать! Вы спросили о частных vars vs свойствах с этим ex:
private string _testVariable;
public string MyProperty
{
get { return _testVariable;}
set {_testVariable = value;}
}
-or-
public string MyProperty { get; set; }
Вы считали:
public string MyProperty { get; private set; }
Вы можете применить область для свойств getters/seters.,, классная вещь. О, да., при использовании этого типа свойства в определяющем классе (например, в конструкторе) добавьте его с помощью "this". - поэтому присваивание будет выглядеть следующим образом: this.MyProperty = "Assigned String"; '. Это делает ваши намерения намного более ясными.,.
Ответ 6
Свойство - это в основном оболочка вокруг поля. Эта оболочка позволяет использовать переменную из внешнего мира. В С# 3.0 вы можете просто объявить свойство, подобное public string MyProperty { get; set; }
. Компилятор автоматически объявляет приватную переменную и также получает заданные методы. Если вам нужно выполнить какие-либо вычисления внутри класса, объявляющего свойство, вы должны использовать для этого личное поле.
Ответ 7
Иногда вы не знаете, когда вы впервые пишете код, можете ли вы добавить еще какой-нибудь код позже, который должен использовать закрытую переменную. Конечно, вы можете добавить его позже, если это необходимо. Я просто автоматически создаю приватную переменную, предполагая, что она будет использоваться позже.
Это может быть более актуальным в крупных корпоративных приложениях или быстро развивающихся приложениях (гибких), где полная реализация может не быть известна во время первоначального кодирования.
Ответ 8
Я ненавижу резервные переменные, когда они не нужны, поэтому это требует большей сложности.
Очевидно, если вам нужно сделать что-то особенное в геттере или сеттере, тогда следует использовать полную семантическую форму, а не сахар.
Также мне нравится использовать свойства как метод отладки, когда свойство устанавливается или используется иногда, это не так очевидно из-за отражения, и это одна из причин, по которым я люблю их использовать.
Мне сложно отлаживать отладку кода, когда есть вероятность, что переменная поддержки может быть доступна либо внутри класса по свойству it self, либо подписям, и ничего не сообщает кодеру правильный путь доступа.
Вы можете получить доступ к внутренней переменной, а также к свойству так, чтобы это было правильно? Это не очевидно...
Ответ 9
Это не связано с С# langugage, но больше с приложением.
Одной из причин использования свойств является то, что во многих инфраструктурах он рассматривается как "Специальный".
Например, Silverlight и WPF будут привязываться к свойствам, а не к полям