Блокировка доступа к частным переменным-членам? Принудительное использование публичных объектов?

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

private string m_hello = null; public string Hello { get{return m_hello;} set{m_hello = value;} } 

Для методов содержащего classа вышеуказанных частных / публичных членов существует ли вообще ограничение доступа к частной переменной? Мне не нравится, что я могу использовать m_hello или Hello.

Благодарю.

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

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

Как утверждали другие, это должно быть ответом …

Вы все еще можете использовать автоматические свойства в C # 3 при таргетинге на .NET 2.0 наряду с несколькими другими функциями C # 3 . В отличие от (например) деревьев выражений, автоматическим свойствам не требуется ничего особенного из CLR или frameworks, помимо атрибута [CompilerGenerated] (который был введен в .NET 2.0).

Поэтому, если вы используете VS2008 или VS2010, тогда стоит использовать автоматическое свойство.

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

  public string Name { private string name; get { return name; } set { name = value; } } 

Я рассматриваю это немного как создание частной переменной readonly – это не имеет никакого отношения к клиентам, но это помогает обеспечить правильность внутри самого кода classа.

Вы можете выполнить это через наследование:

 abstract class A // A is not instantiatable due to being abstract { private string m_hello = null; public string Hello { get{return m_hello;} set{m_hello = value;} } } class B : A { // B now cannot access the private variable, use B in your code instead of A } 

Я не утверждаю, что это хорошо. Просто это можно сделать.

Нет. Любой метод внутри classа будет иметь доступ к обоим.

Ваша команда должна стандартизировать использование (свойство или приватная переменная).

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

Нет, в принципе. Ну, вы могли бы что-то сделать с предупреждениями компилятора через [Obsolete] и #pragma , но это было бы чрезмерным.

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

 while(true) { } 

или вы просто положили это, чтобы «не быть глупым»? ;п

Вы должны получить доступ к свойству только через общедоступное свойство Hello. Это и есть причина этого шаблона. Если вы добавите какие-либо функции в get или set, если вы обращаетесь к частному экземпляру, вы введете ошибки в свой код. Но anwer – НЕТ, вы не можете запретить кому-то звонить Частным, когда они находятся внутри вашего classа, изменяя ваш код.

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

Это имеет смысл для меня: код внутри classа представляет реализацию этого classа; зачем скрывать реализацию от себя?

Вот пример того, что я имею в виду. Предположим, у меня есть член, m_denominator , и я хочу, чтобы он никогда не был равен нулю:

 private int m_denominator = 1; public int Denominator { get { return m_denominator; } set { if (value == 0) throw new ArgumentException("Denominator must not be zero."); m_denominator = value; } } 

Я мог бы сказать себе: «Хорошо, везде, где я устанавливаю это значение в этом classе, я должен использовать Denominator чтобы убедиться, что я не устанавливаю его на ноль». Но я полностью контролирую то, что я задаю Denominator – я внутри classа! В этом случае точкой логики в свойстве Denominator является защита classа от недопустимых значений, установленных клиентским кодом. Нет никакого оправдания для установки вашего внутреннего состояния на какое-то недопустимое значение в реализации самого classа.

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

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

  • Зачем использовать наследование вообще?
  • Обработка инкрементного моделирования данных Изменения в функциональном программировании
  • Почему в C # существуют абстрактный class и интерфейс?
  • Инкапсуляция против абстракции?
  • Что такое экземпляр Java?
  • Каковы различия между структурой и classом в C ++?
  • интерфейс как параметр метода в Java
  • Разделение кода classа в файл заголовка и cpp
  • «Нестатическая переменная, на которую нельзя ссылаться из статического контекста» при создании объекта
  • Когда мне нужно использовать интерфейсы вместо абстрактных classов?
  • Что такое polymorphism, для чего он используется и как он используется?
  • Interesting Posts

    Как настроить собственный сервер GIT? Что такое голые / не-голые репозитории?

    Может ли это быть хорошим подходом к обеспечению более безопасной защиты ОС от вредоносного ПО?

    Создание структуры для агрегирования

    Как равномерно распределить скорость модема dsl?

    c # Класс SmtpClient, не способный отправлять электронную почту с помощью gmail

    Как доказать, что провайдер блокирует входящий трафик на некоторых портах?

    Echo newline в Bash печатает буквально \ n

    Как определить dimens.xml для каждого размера экрана в Android?

    Что такое общий интерфейс шлюза (CGI)?

    hive regexp_extract weirdness

    Как отобразить изображение base64 в UIImageView?

    Не удается подключиться к компьютеру Windows для совместного использования файлов

    Самый простой способ набрать дефис на Mac?

    Угловой запрос JS POST, не отправляющий данные JSON

    Access Finder «Открыть с» меню из командной строки (для завершения вкладки)

    Давайте будем гением компьютера.