Подтвердить что ты не робот

Что такое соглашение об именах статических полей С#?

Недавно я начал использовать ReSharper, который является фантастическим инструментом. Сегодня я столкнулся с правилом имен для статических полей, а именно с префиксом с подчеркиванием, т.е.

private static string _myString;
  • Это действительно стандартный способ назвать статические переменные? Если это так, это личное предпочтение и стиль, или это имеет какой-то эффект более низкого уровня? Например, компиляция JIT и т.д.
  • Откуда этот стиль? Я всегда ассоциировал его с С++, это правильно?
4b9b3361

Ответ 1

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

Общие соглашения: camelCase, _camelCase и даже иногда похмелье из С++/MFC m_camelCase.

Если вы используете camelCase без префикса, поля поддержки свойств будут отличаться от имени свойства только в случае, что не является проблемой на С#, но не будет работать на языке, не учитывающем регистр, например VB.NET.

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

Ответ 2

В соответствии с MSDN используйте Паскаль Кейс для статических полей. Я всегда хихикаю, когда MSDN и StyleCop противоречат друг другу:).

Итак, если вы следуете стандартам MSDN, правильный путь:

private static string MyString;

Ответ 3

На самом деле это стиль для частного поля, статического или нет. (По крайней мере, в ReSharper)

Ответ 4

В соответствии с StyleCop (и с настройками по умолчанию) правильный способ назвать большинство полей (как указано ниже) имеет строчный регистр буква в начале.

SA1306: FieldNamesMustBeginWithLowerCaseLetter

... Имена полей и переменных должны начинаться с буквы в нижнем регистре, если поле не является общедоступным или внутренним, const или не-частным и readonly. В этих случаях поле должно начинаться с буквы верхнего регистра.

См. также SA1309: FieldNamesMustNotBeginWithUnderscore.

Ответ 5

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

Возможно, это преднамеренно?

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

public class Employee
{
    private static Int32 thresholdPercentage = 5;
    public static String TooMuchMessage = "Unacceptable pay rise - sorry!";

    private Decimal _salary = 0.0m;

    public void RaiseSalary(Int32 raiseAmountPercentage)  
    {
        if (raiseAmountPercentage > Employee.thresholdPercentage)
            throw new ApplicationException(Employee.TooMuchMessage);

        _salary *= 1 + (raiseAmountPercentage / 100);

        return;
    }
}

Ответ 6

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

Ответ 7

1 - Не существует стандартного правила для имен переменных. Существуют требования к компилятору С# для разрешенных и не разрешенных (т.е. Не могут начинаться с числа), но правила стиля программирования на языке, как правило, остаются за программистами/организациями. ReSharper имеет заранее определенные правила стиля; однако они просто устанавливаются как значения по умолчанию в соглашении по конфигурации и могут быть изменены.

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

Ответ 8

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

Для статических переменных мне нечего беспокоиться о том, чтобы показать публичность/закрытость видимости через имя, а не указывать, как переменная работает между экземплярами. Кроме того, поскольку нет (и действительно не должно быть) многих Статических переменных, модификатор типа "Хугариан" не применяется часто.

Аналогично, для статических переменных потока ([ThreadStatic] или ThreadLocal) конвенция, которую я использую, - TS_UpperCamelCase (например. TS_Random). И снова этот "разрыв" с нормами передает очень важную информацию, которую другие разработчики могут не увидеть на первый взгляд. Таким образом, имя используется как предостерегающий флаг.

Я использую ReSharper и соответствующим образом скорректировал предупреждения/подсказки; большинство других соглашений об именах сохраняются в настройках ReSharper по умолчанию.

Мой выбор таких "нестандартных" условностей для статических/поточно-статических полей (примечание: Microsoft использует TS_ в некотором коде в библиотеке .NET), потому что я столкнулся с более чем "quirk" из-за неправильной идентификации переменных Static/ThreadStatic/Instance: это намного сложнее сделать с StaticX, TS_X, _x.