Почему частный сеттер?

Мне интересно, зачем нам нужен частный сеттер, когда мы можем просто напрямую присвоить значение частному объекту? Рассмотрим следующий код:

private int counter = 0;
public int Counter {
    get {
        return counter;
    }
}

Я не вижу никакой разницы между наличием частного установщика (счетчик = 1) и присвоением значения непосредственно частному объекту (счетчик = 1) в контексте выше.

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


person user1928346    schedule 01.01.2014    source источник
comment
возможный дубликат понимания частных сеттеров   -  person Soner Gönül    schedule 02.01.2014
comment
Downvoters: Хотите объяснить? Это звучит как законный вопрос.   -  person Douglas    schedule 02.01.2014
comment
Я думаю, что это действительно дубликат ... но не понимаю, почему за него проголосовали.   -  person johnnycardy    schedule 02.01.2014
comment
Вы когда-нибудь слышали об инкапсуляции? Первый из трех столпов ООП? Если нет, я предлагаю вам запустить вашу любимую поисковую систему...   -  person Dean Kuga    schedule 02.01.2014


Ответы (3)


Если вы используете свойство auto, вы не видите фоновое поле:

public int Counter { get; private set; }

Это позволяет вам сделать его приватным для установки и общедоступным для получения без необходимости самостоятельно писать вспомогательное поле.

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

person Reed Copsey    schedule 01.01.2014

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

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

private int counter = 0;
public int Counter {
    get {
        return counter;
    }
    private set {
        if(value > 0)
        {
            counter = value;
        }
    } 
}
person Adarsh Shah    schedule 01.01.2014

Геттеры и сеттеры обычно общедоступны и ограничивают использование переменной другими классами.

Геттеры и сеттеры часто содержат логику, которая применяется при изменении их значений. Предотвращение неверных назначений, инициирование событий и тому подобное. Поэтому, безусловно, может быть полезно написать частный сеттер, если переменная должна быть изменена только в одном классе. Если вы хотите внести только простые изменения, такие как X++ или x = что угодно, то, вероятно, нет никакого смысла в частном методе установки.

person Alex Russell    schedule 01.01.2014