Должны ли частные классы обращаться к свойствам? - PullRequest
3 голосов
/ 02 января 2011

Я использую экземпляр закрытого класса в качестве объекта состояния, предоставленного операции stream.BeginRead.(Этот класс является закрытым для моего класса чтения / записи основного потока.)

public class MainClass
{
    // ...

    private class ResponseState
    {
        public IResponse response;
        public Stream stream;
        public byte[] buffer = new byte[1024];
    }
}

Доступ к классу осуществляется непосредственно через поля.Должен ли я действительно предоставлять доступ к классу через свойства в этом случае, даже если он используется только для хранения состояния?

Ответы [ 5 ]

5 голосов
/ 02 января 2011

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

См. StyleCop SA1401 : FieldsMustBePrivate.

TypeName - FieldsMustBePrivate
CheckId - SA1401
Категория - Правила сопровождения

Причина

Поле в пределахкласс C # имеет модификатор доступа, отличный от private.

Описание правила

Нарушение этого правила происходит всякий раз, когда для поля в классе предоставляется не приватный доступ.Из соображений удобства обслуживания свойства всегда должны использоваться в качестве механизма для представления полей вне класса, а поля всегда должны объявляться с закрытым доступом.Это позволяет внутренней реализации свойства изменяться со временем без изменения интерфейса класса.

Поля, расположенные в структурах C #, могут иметь любой уровень доступа.

КакИсправление нарушений

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

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

2 голосов
/ 02 января 2011

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

Это может показаться излишним, но, честно говоря, учитывая автоматически реализованные свойства, так легко объявить свойство, что вы можете использовать его, чтобы обеспечить максимальную гибкость.

1 голос
/ 02 января 2011

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

Однако, поскольку в C # 3.0 мы используем автоматические свойства , поэтому мы всегда используем свойства для доступа к закрытым полям.

В любом случае, эффект тот же, в нашем случае он должен был сделать код более читабельным.

0 голосов
/ 02 января 2011

Я только что прочитал об этом неделю или две назад.Есть два лагеря.Один из них говорит, что вы должны обернуть помещение, потому что так сказал мой учитель, и все остальные делают это.Они говорят, что легче добавить дополнительную логику к свойству или более легкую в обслуживании и некоторые другие слабые причины.Другой лагерь, называющий себя «настоящими ОО-парнями», склонен идти по пути того, что если вы вообще используете свойства, вы делаете это неправильно (за некоторыми исключениями, конечно).Насколько я могу судить, ваш случай был бы исключением.На самом деле, думая об этом, они, вероятно, все еще говорят, что вы делаете это неправильно :) Просто не могу победить.В любом случае, они также говорят, что если вы собираетесь их использовать, не беспокойтесь о переносе, если вам не нужна дополнительная логика в ваших установщиках и получателях.Зачем тормозить вашу программу ни за что.(по-видимому, они могут измерить, насколько медленно).

Я склонен использовать свойства над полями, так как я использую много MVVM, и мне нужно реализовать INotifyPropertyChanged, который требует их.В твоем случае я бы не стал беспокоиться о том, чтобы обернуть их в свойствах, которые просто бесполезны.Но если бы это было в классе, который нуждался в свойстве, то я бы обернул их, чтобы сохранить сходство в этом классе.

Если после всего этого вы не обернули их, а вам нужно было позже, щелкните правой кнопкой мыши поле refactor-> encapsulate, чтобы обернуть свойство, если у вас есть Resharper.

0 голосов
/ 02 января 2011

Рекомендуется использовать свойства для каждого члена, доступного для других типов. Автоматические свойства в C # 3.0 делают это довольно просто.

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