Соглашение об именовании констант в C #?


420
private const int THE_ANSWER = 42;

или

private const int theAnswer = 42;

Лично я думаю, что с современными IDE мы должны использовать CamelCase, так как ALL_CAPS выглядит странно. Что вы думаете?


4
@mmiika: что означает «the» в этом примере? Это как в «Путеводителе автостопом по Галактике» или оно перенесено из некоторого стандарта кодирования C ++? (Например, старая платформа C ++ для Macintosh, THINK C [и более поздняя версия, Symantec C ++], использовали префикс «it» для элементов указателя / ссылки и «the» для скалярных элементов.)
Питер Мортенсен,

5
@Peter, так как значение константы равно 42, я твердо верю, что это ссылка на Справочник Автостопщика по Галактике .
Albireo

@PeterMortensen Это креативно! Но такие имена, как itsEmployee и itsCostumer звучат так, будто они могут вводить в заблуждение.
Камило Мартин

4

Я предпочитаю theAnswer. Ранее был фанатом нотаций в Венгрии, но с тех пор, как я научился его не использовать, я люблю строго избегать мета-указаний в именовании. То же самое касается интерфейсов, как IInterface. Я предпочитаю Interfacable. Но, работая в команде, я должен был соблюдать правила :(
nawfal

Ответы:


485

Рекомендуемое именование и капитализация конвенция заключается в использовании P ascal C asing для констант (Microsoft есть инструмент под названием StyleCop , что документы всех предпочтительные конвенции и могут проверить источник на предмет соответствия - хотя это немного слишком анально сохраняющие вкусы многих людей) , например

private const int TheAnswer = 42;

Соглашение об использовании заглавных букв в Паскале также задокументировано в Руководстве по проектированию платформы Microsoft .


51
На самом деле StyleCop - это «не продукт Microsoft», а «инструмент, разработанный очень увлеченным разработчиком в Microsoft (по вечерам и выходным)». (Подробности см. В блогах blogs.msdn.com/sourceanalysis/archive/2008/07/20/… и blogs.msdn.com/bharry/archive/2008/07/19/… ). Как говорится, именование фреймворка Microsoft конвенции используют Паскаль корпус для констант, так что инструмент просто соблюдение стандарта , который Microsoft делает публикации и утверждение.
bdukes

12
@bdukes - я не говорил, что это продукт Microsoft, однако он довольно широко используется и поддерживается во всей организации (как бывший сотрудник, я использовал его за годы до того, как кто-то за пределами Microsoft заполучил его, поэтому Я хорошо знаю его наследие).
Грег Бич

8
Мне это не нравится, потому что первая буква обычно используется, чтобы указать, является ли переменная видимой снаружи или нет. В коде TheAnswer выглядит как публичная собственность, а не приватная константа для меня. Я бы предпочел использовать префикс, например, constTheAnswer и ConstTheAnswer.
Эфрейн

52
Я бы использовал нотацию TheAnswer, за исключением случаев, когда значение равно 42, и в этом случае я бы определенно придерживался подхода ALL_CAPS.
Benoittr

4
Разве частное поле не должно быть верблюжьим, если оно постоянное?
Маркус Мейер

70

Визуально верхний регистр - это путь. Это так узнаваемо. Ради уникальности и не оставляя шансов угадать, я голосую за UPPER_CASE!

const int THE_ANSWER = 42;

Примечание . Верхний регистр будет полезен, когда константы должны использоваться в одном и том же файле в верхней части страницы и для целей интеллектуального анализа; однако, если бы они были перемещены в независимый класс, использование верхнего регистра не имело бы большого значения, например:

public static class Constant
{
    public static readonly int Cons1 = 1;
    public static readonly int coNs2 = 2;
    public static readonly int cOns3 = 3;
    public static readonly int CONS4 = 4;
}

// Call constants from anywhere
// Since the class has a unique and recognizable name, Upper Case might lose its charm
private void DoSomething(){
var getCons1 = Constant.Cons1;
var getCons2 = Constant.coNs2;
var getCons3 = Constant.cOns3;
var getCons4 = Constant.CONS4;
 }

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

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

23
@usefulBee "SNAKE_CASE" настоятельно не рекомендуется в C #; Этот ответ неверен. Правильный случай для conts в C # - "TitleCase".
BrainSlugs83

13
@ BrainSlugs83, я не думаю, что здесь правильно или неправильно; все сводится к предпочтениям и тому, что делает код более понятным.
полезноBee

2
@usefulBee Согласен. Но все же хорошо отметить, каков консенсусный способ написания этого. В последнее время я делал множество кода на Ruby, и я думаю, что SCREAMING_SNAKE_CASE имеет смысл: совершенно очевидно, что это что-то особенное, и вам даже не нужно наводить указатель / Перейти к определению, чтобы узнать, о чем он. Вы знаете это немедленно.
Пер Лундберг

69

На самом деле, это

private const int TheAnswer = 42;

По крайней мере, если вы посмотрите на библиотеку .NET, какой IMO - лучший способ решить соглашения об именах - чтобы ваш код не выглядел неуместно.


23

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

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

Мой вывод: иди с верблюжьей шкурой. Может быть, я тоже поменяю свой стиль ;-)

Редактировать:

То, что что-то пахнет венгерским, не совсем верный аргумент, ИМО. Вопрос всегда должен быть: это помогает, или это больно?

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


30
Код читается гораздо чаще, чем написано. Конечно, когда вы пишете код, компилятор не позволит вам присвоить константу. Но как насчет парня, который должен поддерживать ваш код через два года? Конечно, приятно сразу же узнавать постоянную.
Грег Хьюгилл

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

5
Если вы подумаете об этом, привычка в верхнем регистре, вероятно, возникла из макросов препроцессора, а не из констант (я никогда не использовал заглавные буквы для истинных констант). В этом контексте имеет смысл отличать макросы от реального кода, потому что макрос вполне может быть выражением, а не постоянным значением, его расширение может вызывать побочные эффекты и так далее. Так что вам нужно знать, когда вы используете макрос и когда вы используете const. Лично я рад видеть обратную сторону макросов препроцессора, у них был большой потенциал, чтобы затруднить чтение кода.
Тим Лонг

7
@Tim: Согласен, в конце макросы препроцессора принесли больше вреда, чем пользы. Мой самый любимый макрос PP: "#DEFINE Private Public" ;-)
Треб

1
@Tim: библиотека стандартных шаблонов C ++ приняла строчные буквы для констант, например, std :: string :: npos ( cplusplus.com/reference/string/string/npos ). Так что ALL_CAPS предназначен только для макросов и директив препроцессора, что делает его еще более глупым в C #.
Ричард Дингвол

16

Во-первых, венгерская нотация - это практика использования префикса для отображения типа данных параметра или предполагаемого использования. Соглашения Microsoft о присвоении имен для отказа от венгерской нотации http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

Использование UPPERCASE не рекомендуется, как указано здесь: Pascal Case является приемлемым соглашением и SCREAMING CAPS. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Microsoft также заявляет, что UPPERCASE можно использовать, если это сделано для соответствия существующей схеме. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

Это в значительной степени подводит итог.


3
Да, венгерские обозначения не все заглавные.
сниббец

13

В своей статье Constants (Руководство по программированию в C #) Microsoft приводит следующий пример:

class Calendar3
{
    const int months = 12;
    const int weeks = 52;
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

Итак, для констант, похоже, что Microsoft рекомендует использовать camelCasing. Но обратите внимание, что эти константы определены локально .

Возможно, наименование внешне видимых констант представляет больший интерес. На практике Microsoft документирует свои открытые константы в библиотеке классов .NET как поля . Вот некоторые примеры:

Первые два примера PascalCasing. Третий, кажется, следует за Соглашениями о капитализации Microsoft для двухбуквенной аббревиатуры (хотя pi не является акрионимом). И четвертый, кажется, предполагает, что правило для двухбуквенного акрионима распространяется на однобуквенное сокращение или идентификатор, такой как E(который представляет математическую константу e ).

Кроме того, в своем документе «Соглашения о капитализации» Microsoft прямо заявляет, что идентификаторы полей должны быть названы через, PascalCasingи приводит следующие примеры для MessageQueue.InfiniteTimeout и UInt32.Min :

public class MessageQueue
{
    public static readonly TimeSpan InfiniteTimeout;
}

public struct UInt32
{
    public const Min = 0;
}

Вывод: используйте PascalCasingдля открытых констант (которые задокументированы как constили static readonlyполя).

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


Разработчик, написавший эту статью, явно не следовал рекомендациям Microsoft по стилеванию для C #.
BrainSlugs83

2
Статья, на которую указывает этот ответ, изменилась. Консты теперь общедоступны и были PascalCased. Учитывая оба эти изменения, это не помогает ответить, должны ли частные константы быть PascalCased или camelCased.
Metalogic

12

Оставь венгров венграм.

В примере я бы даже пропустил окончательную статью и просто пошел с

private const int Answer = 42;

Это ответ или это ответ?

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


2
В данном конкретном случае это ответ. Но только потому, что я очень люблю читать Д.Адамса.
Треб

да, но в чем вопрос? и не кормите меня извините за неудобства;)
голубь

2
Ах, но так как вы уже знаете ответ, вы не можете знать вопрос. Они взаимоисключающие. (Держу пари, ты уже знал это ;-)
Треб

Это правильный ответ на вопрос ОП. - Я бы дважды проголосовал за то, чтобы убрать, Theесли бы мог. :-)
BrainSlugs83

Кто такой венгр, говорит ли этот ответ, что им разрешено использовать другое соглашение?
Капитан Принни


6

Я полагаю, что ALL_CAPS взят из способа работы C и C ++. В этой статье здесь объясняет , как различия в стиле произошло.

В новых IDE, таких как Visual Studio, легко определить типы, область действия и, если они постоянны, это не является строго обязательным.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.