Защищенное поле C # сделать частным, добавить свойство - почему?

StackOverflow https://stackoverflow.com/questions/1703382

Вопрос

В командной системе Visual Studio 2008 я только что запустил Анализ кода (из меню Analyze) в одном из моих проектов на C #.Одно из выданных предупреждений было следующим:

Майкрософт.Дизайн :Поскольку поле 'Connection._domain' отображается вне его объявляющего типа, измените его доступность на private и добавьте свойство с той же доступностью, что и у поля в настоящее время, чтобы предоставить к нему доступ.

Это относится к следующему полю:

public abstract class Connection
{
    protected string _domain;
}

Я не понимаю мотивов, стоящих за этим предложением.Это то, что, я думаю, он хочет, чтобы я сделал:

public abstract class Connection
{
    private string _domain;
    protected string Domain { get { return _domain; } set { _domain = value; } }
}

Два вопроса:

  1. Правильно ли я понял, что предложение хочет, чтобы я сделал с точки зрения кода?
  2. Почему он хочет, чтобы я это сделал?
Это было полезно?

Решение

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

public string Domain { get; set; }

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

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

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

Это один из основных принципов ООД - инкапсуляции, также называемый "скрытием данных".

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

Ваш перевод верен.Тот же аргумент for может быть приведен для использования "защищенных" свойств, что и для использования "общедоступных" свойств вместо прямого предоставления переменных-членов.

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

protected string Domain { get; set; }

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

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

В ответ на ваш вопрос...ДА.

Однако я бы просто использовал синтаксис auto-property:

public abstract class Connection
{
    protected string Domain { get; set; }
}

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

Выбранный ответ по ссылке лучше всего отражает это: "Свойства обеспечивают инкапсуляцию.Вы можете включить любую необходимую проверку / форматирование / преобразование в код для свойства.Это было бы трудно сделать для филдса ".

http://social.msdn.microsoft.com/Forums/en-IE/netfxbcl/thread/985f4887-92ae-4ec2-b7ae-ec8cc6eb3a42

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

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

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