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

Почему я должен использовать приватную переменную в аксессуре свойств?

Извините Если я ноб, у меня есть это сомнение, почему мы используем частные переменные и устанавливаем их с помощью свойств?

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

Я говорю о таких ситуациях

private string _testVariable;

public string MyProperty
{
    get { return _testVariable;}
    set {_testVariable = value;}
}

Я просто хочу использовать

public string MyProperty { get; set; } 

Почему избыточная частная переменная? эти две стратегии разные? может кто-нибудь попробует пролить свет на это.

Спасибо

4b9b3361

Ответ 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 будут привязываться к свойствам, а не к полям