Если у моего класса есть свойство с приватным полем для хранения, должен ли я использовать приватное поле или свойство для его инициализации в конструкторе? - PullRequest
2 голосов
/ 13 июля 2010

Что из следующих двух лучше?Почему?
Отл.1:


public class TestClass
{
    public TestClass(CoolClass cool)
    {
        this.Cool = cool;
    }

    CoolClass _cool
    public CoolClass Cool
    {
        get
        {
            return _cool;
        }
        set
        {
            _cool = value;
        }
    }
}

Пример.2:


public class TestClass
{
    public TestClass(CoolClass cool)
    {
        _cool = cool;
    }

    CoolClass _cool
    public CoolClass Cool
    {
        get
        {
            return _cool;
        }
        set
        {
            _cool = value;
        }
    }
}

(я знаю, что можно просто сделать public CoolClass { get; set; }, но давайте на секунду проигнорируем это.) Я думаю, это просто сводится к: Из класса, еслииспользовать его свойства или соответствующие поля для получения / установки значений?

РЕДАКТИРОВАТЬ: Большое спасибо всем за ваши ответы.Кажется, что существует множество противоречивых мнений.Итак, вот что я решил, дайте мне знать, что вы думаете: я буду использовать свойства всякий раз, когда это возможно;только при наличии побочных эффектов я буду использовать другой способ доступа.
Почему?
- мне нравится идея доступа к переменной только из одного места.
- Я могу легко интегрировать логику в доступ к переменным.
- я часто использую public CoolClass { get; set; }, поэтому использование свойств, когда это возможно, более согласованно.
И я заметил, что, к сожалению, невозможно объявить свойство с несколькими получателями / установщиками, которые имеют разные модификаторы видимости - оно будетбыло приятно иметь как частного, так и общедоступного сеттера ...

Ответы [ 6 ]

1 голос
/ 13 июля 2010

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

0 голосов
/ 13 июля 2010

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

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

0 голосов
/ 13 июля 2010

Я думаю, что вы могли бы спорить в обоих случаях в этом случае. Я обычно использую поле напрямую - я думаю, что таким образом немного более ясно, что я просто присваиваю значение, а не выполняю другие проверки / обработку. Сказав, что большинство моих занятий неизменны, так что это единственный способ.

С другой стороны, вы можете утверждать, что когда определитель задан, вы должны использовать его повсеместно, чтобы поддерживать уровень косвенности между полем и кодом, который его использует, чтобы при вводе проверки / обработки в установщик ваш код будет согласованным.

0 голосов
/ 13 июля 2010

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

0 голосов
/ 13 июля 2010

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

0 голосов
/ 13 июля 2010

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

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

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