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

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

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

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

private string _testVariable;

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

Я думаю о простом использовании

public string MyProperty { get; set; } 

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

Спасибо

23
задан Ahmad 28 January 2015 в 13:56
поделиться

8 ответов

Ваши примеры семантически одинаковы. Краткий синтаксис объявления свойств (просто имеющий { get; set; }) - это ярлык, доступный в C# 3.0. Компилятор на самом деле создает приватную переменную поддержки и простой геттер и сеттер, как в первом примере.

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

.
31
ответ дан 29 November 2019 в 01:35
поделиться

1-ый код перебивает вас, чтобы изменить некоторое состояние частного класса. Обертывание приватного состояния в свойство приятно, так как оно скрывает реализацию. Позже вы можете изменить реализацию и свойство (внешний интерфейс) может остаться неизменным.

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

Автоматические свойства в вашем 2-м снипе кода вообще не связаны с приватной переменной. Автоматическое оформление свойств, как и явное оформление свойств, используемое в первом снайпе, позволяет модифицировать его в будущем. В рамках этой модификации, например, можно конвертировать из автоматических свойств в явно реализованные.

2
ответ дан 29 November 2019 в 01:35
поделиться

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

Если все, что вы делаете, это читаете/записываете переменную, то нет. В противном случае, есть две причины, по которым вам нужна приватная переменная:

Валидация данных

// 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;
        }
    }
}

Геттер/установщик обертывает базовое хранилище данных

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++;
        }
    }
}
14
ответ дан 29 November 2019 в 01:35
поделиться

Второй пример, который вы приводите:

public string MyProperty { get; set; }

доступен только в более поздних версиях . Net framework (v3.0 и далее, на мой взгляд)

Первый пример позволяет устанавливать точки останова на return и операторы присваивания, в результате чего ваш отладчик ломается, когда свойство присваивается / считывается.

.
2
ответ дан 29 November 2019 в 01:35
поделиться

Собственность - это, по сути, обёртка вокруг поля. Эта обертка позволяет использовать переменную из внешнего мира. В C#3.0 можно просто объявить такое свойство как public string MyProperty { get; set; } Компилятор автоматически объявляет приватную переменную и для этого также получает методы set. Если необходимо произвести какое-либо вычисление внутри класса, объявляющего свойство, то для этого следует использовать поле private.

.
0
ответ дан 29 November 2019 в 01:35
поделиться

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

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

.
0
ответ дан 29 November 2019 в 01:35
поделиться

Mashesh, Мы все должны были с чего-то начать! Вы спрашивали о приватных vars vs свойствах с помощью этого ex:

private string _testVariable;

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

-or-

public string MyProperty { get; set; }

Did you consider:

public string MyProperty { get; private set; }

You can apply scope to property getters/setters ... cool stuff. О да . . . при использовании этого типа свойств в определяющем классе (как в конструкторе) префиксовать его с помощью 'this.' - так, чтобы присваивание выглядело как 'this.MyProperty = "An Assigned String";'. Это делает ваши намерения намного более понятными . . . .

2
ответ дан 29 November 2019 в 01:35
поделиться

Это не связано с C# ипотекой, а скорее с заявлением.

Одной из причин использования свойств является то, что во многих фреймворках они рассматриваются как "специальные". Например, Silverlight и WPF будут привязываться к свойствам, а не к полям

.
-1
ответ дан 29 November 2019 в 01:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: