C # умова іменування констант?


419
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 ++], використовували префікс "його" для членів вказівника / посилання та "" для скалярних членів.)
Peter Mortensen

5
@ Петер, оскільки значення константи дорівнює 42, я дуже вірю, що це посилання на Посібник з автостопом до Галактики .
Альбірео

@PeterMortensen Це креативно! Але такі назви якEEEEEEEEEYEEE і йогоCostumer звучать так, ніби вони можуть вводити в оману.
Каміло Мартін

4
MSDN: Конвенції про капіталізацію msdn.microsoft.com/en-us/library/vstudio/ms229043(v=vs.90).aspx
Капітан

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

Відповіді:


484

Рекомендоване іменування і капіталізація конвенція полягає в використанні 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 публікує та затверджує.
бдук

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

8
Мені це не подобається, тому що перша буква зазвичай використовується, щоб вказати, чи є змінна зовнішньою, чи ні. У коді TheAnswer виглядає як державна власність, а не приватне обмеження для мене. Я б фактично вважав за краще використовувати префікс типу constTheAnswer і ConstTheAnswer.
Ефрайн

52
Я б пішов із позначенням TheAnswer, за винятком випадків, коли значення дорівнює 42, і тоді я б точно дотримувався підходу ALL_CAPS.
Беноіттр

4
Чи не слід закривати приватне поле верблюдом, подією, якщо це const?
Маркус Мейєр

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 і для констант, оскільки це робить їх набагато легшими для ідентифікації порівняно з будь-яким з інших випадків.
dub stylee

23
@usefulBee "SNAKE_CASE" сильно не рекомендується використовувати C #; Ця відповідь неправильна. Правильний випадок consts у C # - "TitleCase".
BrainSlugs83

13
@ BrainSlugs83, я не думаю, що тут правильно чи неправильно; це зводиться до переваг і того, що робить код більш зрозумілим.
кориснеБе

2
@usefulBee Погоджуюся. Але все-таки добре позначити, який є консенсусний спосіб його написання. Останнім часом я займаюся кодом Ruby, і я думаю, що SCREAMING_SNAKE_CASE має сенс: дуже очевидно, що це щось особливе, і вам навіть не потрібно наводити / Перейти до визначення, щоб дізнатися, про що йдеться. Ви це знаєте негайно.
Пер Лундберг

69

Власне, так і є

private const int TheAnswer = 42;

Принаймні, якщо ви подивитеся на бібліотеку .NET, який ІМО є найкращим способом прийняти рішення про іменування, щоб ваш код не виглядав поза місцем.


23

Я все ще переживаю великі регістри для значень const, але це більше за звичкою, ніж з якоїсь конкретної причини.

Звичайно, це дозволяє легко зрозуміти, що щось є const. Питання до мене: Чи нам справді потрібна ця інформація? Чи допомагає нам якимось чином уникнути помилок? Якщо я призначу значення const, компілятор скаже мені, що я зробив щось німе.

Мій висновок: ідіть із кожухом верблюда. Можливо, я теж зміню свій стиль ;-)

Редагувати:

Що щось пахне угорською - це насправді не вагомий аргумент, IMO. Завжди має бути питання: чи допомагає це, чи болить?

Бувають випадки, коли угорщина допомагає. Не так багато сьогодні, але вони все ще існують.


30
Код читається набагато частіше, ніж написано. Впевнений, що коли ви пишете код, компілятор заважатиме вам призначати константу. А як же хлопець, який має підтримувати ваш код два роки відтепер? Це приємно, що можна розпізнати константу негайно.
Грег Х'югілл

2
На сьогоднішній день IDE сприймає багато проблем перед компіляцією. Я не думаю, що розпізнавання константи по імені є важливим, інакше не слід також додавати якесь спеціальне ім'я для змін, що читаються тільки?
mmiika

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

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

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

16

По-перше, угорська нотація - це практика використання префікса для відображення типу даних параметра або призначення. Конвенції Майкрософт про іменування не відповідають угорській нотації http://en.wikipedia.org/wiki/Hungarian_notation http://msdn.microsoft.com/en-us/library/ms229045.aspx

Використання UPPERCASE не рекомендується, як зазначено тут: Паскальний кейс є прийнятною умовою і СКРЕМІНГ КАПС. http://en.wikibooks.org/wiki/C_Sharp_Programming/Naming

Тут також Microsoft заявляє, що UPPERCASE можна використовувати, якщо це зробити відповідно до існуючої схеми. http://msdn.microsoft.com/en-us/library/x2dbyw72.aspx

Це в значній мірі підсумовує це.


3
Так, угорська нотація - це не всі літери.
snibbets

13

У своїй статті « Константи» (Посібник з програмування 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. Третій, як видається, дотримується Конвенцій Майкрософт про капіталізацію двонібурної абревіатури (хоча пі - не акріонім). І четвертий, здається, наводить на думку, що правило для акріоніму з двох літер поширюється на акронім однієї літери або ідентифікатор типу 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 не виступає за конкретні умови іменування або використання великих літер для приватних ідентифікаторів, як показано в прикладах, поданих у питанні.


Розробник, який написав цю статтю, явно не дотримувався рекомендованих корпорацією Майкрософт умов стилів для C #.
BrainSlugs83

2
Стаття, на яку вказує ця відповідь, змінилася. Конкурси зараз є загальнодоступними та пройшли PascalCase. Враховуючи обидві ці зміни, це не допомагає відповісти, чи повинні приватні константи бути PascalCased чи camelCased.
металогіку

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.