В C # каков общепринятый способ ссылки на свойства-члены в классе? - PullRequest
2 голосов
/ 21 января 2009

Прочитал Руководство по именованию MSDN и не смог найти четкого ответа, кроме того, что вам следует избегать подчеркивания в целом. Допустим, у меня есть следующее:

public class Employee
{
    private string m_name;  //to store property value called Name

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }

    public void ConvertNameToUpper()
    {
        //by convention should you use this
        return m_name.ToUpper();

        //or this
        return Name.ToUpper(); 
    }
}

Какое соглашение о присвоении имен для m_name указано выше? Например, в коде, который я наследую, я обычно вижу:

  • m_name
  • _name
  • имя
  • myName или другой случайный идентификатор

Какой из них (или другой) наиболее распространен?

В качестве продолжения в методах класса вы ссылаетесь на внутренний (частный) идентификатор или средство доступа к публичной собственности?

Ответы [ 14 ]

14 голосов
/ 21 января 2009

Я думаю, что независимо от того, какое соглашение об именах вы используете, самое главное, чтобы вы оставались последовательными. Я имею в виду, если вы решите назвать приватных членов как _name, то всегда делайте это так, а не один раз, используя _name, а в другой раз m_name. Я лично использую соглашение о префиксах подчеркивания. (Одна из причин в том, что я использую NHibernate, а у NHibernate есть стратегия доступа field.camelcase-underscore.

На ваш другой вопрос: Это зависит от того, что вы хотите сделать.
Содержит ли ваше свойство дополнительную логику, и хотите ли вы, чтобы эта логика выполнялась при обращении к ней? Тогда используйте собственность. Вы не хотите выполнять логику? Используйте поле. Эрик Липперт написал сообщение об этом в своем блоге.

Для вашей следующей цели: все зависит от ситуации. Если ваше свойство содержит некоторую дополнительную логику, и вы не хотите выполнять эту дополнительную логику при доступе из класса, тогда используйте поле поддержки ...

5 голосов
/ 21 января 2009

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

Кроме этого, я предлагаю вам выбрать один из вышеперечисленных или что-то подобное и просто придерживаться этого. Компания, в которой я работаю, использует vName, где «v» указывает, что это значение свойства.

4 голосов
/ 07 июня 2009

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

Несмотря на то, что ведутся большие дискуссии по поводу использования Style Cop, я хотел бы предложить одну вещь: если вы используете Style Cop, то оставьте все стили включенными. Таким образом, когда вы делитесь между пользователями, все становится намного проще.

Одна из вещей, которые это сообщает, - то, что вы не можете назвать свои личные поля символами подчеркивания. Поэтому я обычно использую camelCase при написании закрытых полей, а затем PascalCase для открытых свойств:

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

Style Cop также обеспечивает использование this., что значительно облегчает чтение.

3 голосов
/ 21 января 2009

Самый распространенный пример кода, который я видел, - это простой префикс _.

Однако, что действительно важно, так это то, что команда соглашается с тем, что является стандартом, и придерживается его.

2 голосов
/ 21 января 2009

Если вы не можете использовать автоматически реализованное свойство, как предлагает Брайан Расмуссен, и вам нужен личный член, то я бы рекомендовал префикс подчеркивания _name.

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

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

1 голос
/ 22 января 2009

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

0 голосов
/ 08 июня 2009

Прежде всего, я и многие другие, с кем я работал, покончили с использованием префикса приватных членов с "m_". Далее, всякий раз, когда я ссылаюсь на закрытый член в классе, я обычно использую слово this, как в "this.privateMemberVariableName". Этого достаточно, чтобы различить, что переменная не является локальной переменной или переменной, переданной в качестве параметра в методе.

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

0 голосов
/ 07 июня 2009

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

0 голосов
/ 22 января 2009

Для переменных уровня класса наши стандарты кодирования говорят, что используют mVariableName или m_VariableName. Главное следить за вашей компанией / учителями / и т. Д. стандарты / практики кодирования.

Лично я получаю доступ к переменной только через ее метод получения / установки, если он есть. Даже если переменная используется только внутри класса, я использую автоматические свойства. Таким образом, я добавляю слой абстракции, что означает меньше кода для рефакторинга, если я что-то изменил.

Кстати, ваша функция void не может вернуть строку .....: -)

...