Вопрос

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

public class MainClass
{
    // ...

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

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

Заинтересована, чтобы узнать, что делают другие.

Это было полезно?

Решение

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

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

Другие советы

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

Видеть Stylecop SA1401: Fieldsmustbeprivate.

Typename - Fieldsmustbeprivate
CheckID - SA1401
Категория - Правила обслуживания

Причина

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

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

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

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

Как исправить нарушения

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top