Распространено видеть _var
имя переменной в поле класса. Что означает подчеркивание? Есть ли ссылка на все эти специальные соглашения об именах?
c#
c++
naming-conventions
Стан
источник
источник
Ответы:
Подчеркивание - это просто соглашение; ничего более. Таким образом, его использование всегда несколько отличается для каждого человека. Вот как я понимаю их для двух рассматриваемых языков:
В C ++ подчеркивание обычно указывает на закрытую переменную-член.
В C # я обычно вижу, что он используется только при определении базовой закрытой переменной-члена для открытого свойства. Другие закрытые переменные-члены не будут иметь подчеркивания. Это использование в значительной степени ушло на второй план с появлением автоматических свойств, хотя.
Перед:
После:
источник
public string Name { get; private set; }
. Правда, он не совсем неизменен, но он есть._var
не зарезервированоРекомендуется НЕ использовать UNDERSCORES перед любым именем переменной или параметра в C ++
Имена, начинающиеся с подчеркивания или двойного подчеркивания, ЗАБРОНИРОВАНЫ для разработчиков C ++. Имена с подчеркиванием зарезервированы для работы библиотеки.
Если вы читали в стандарте кодирования C ++, вы увидите, что на самой первой странице написано:
В частности, рабочий проект ISO устанавливает действующие правила:
Лучше не начинать символ с символа подчеркивания, если вы случайно попали в одно из указанных выше ограничений.
Вы сами можете понять, почему такое использование подчеркивания может иметь катастрофические последствия при разработке программного обеспечения:
Попробуйте скомпилировать простую программу helloWorld.cpp, например:
Вы увидите все, что происходит в фоновом режиме. Вот фрагмент:
Вы можете увидеть, сколько имен начинаются с двойного подчеркивания!
Также, если вы посмотрите на виртуальные функции-члены, вы увидите, что * _vptr - это указатель, сгенерированный для виртуальной таблицы, который автоматически создается, когда вы используете одну или несколько виртуальных функций-членов в своем классе! Но это другая история ...
Если вы используете подчеркивание, вы можете столкнуться с конфликтными проблемами и не будете знать, что их вызывает, пока не станет слишком поздно.
источник
На самом деле
_var
соглашение происходит от VB, а не C # или C ++ (m _, ... это другое дело).Это привело к преодолению нечувствительности к регистру VB при объявлении свойств.
Например, такой код не возможен в VB, потому что он считает
user
иUser
тем же идентификаторомТаким образом, чтобы преодолеть это, некоторые использовали соглашение, чтобы добавить '_' в приватное поле, чтобы получить вот так
Поскольку многие соглашения предназначены для .Net и для сохранения некоторого единообразия между соглашениями C # и VB.NET, они используют один и тот же.
Я нашел ссылку на то, что я говорил: http://10rem.net/articles/net-naming-conventions-and-programming-standards---best-practices
источник
Первый комментатор (R Samuel Klatchko) ссылался: каковы правила использования подчеркивания в идентификаторе C ++? который отвечает на вопрос о подчеркивании в C ++. В общем, вы не должны использовать начальное подчеркивание, так как оно зарезервировано для разработчика вашего компилятора. Код, с которым вы сталкиваетесь,
_var
вероятно, является либо устаревшим кодом, либо кодом, написанным кем-то, кто вырос, используя старую систему именования, которая не зацикливалась на ведущих подчеркиваниях.Как говорится в других ответах, он использовался в C ++ для определения переменных членов класса. Тем не менее, он не имеет особого значения для декораторов или синтаксиса. Так что, если вы хотите использовать его, он скомпилируется.
Я оставлю обсуждение C # другим.
источник
_var не имеет смысла и служит только для того, чтобы упростить распознавание того, что переменная является закрытой переменной-членом.
В C ++ использование соглашения _var является плохой формой, поскольку существуют правила, регулирующие использование подчеркивания перед идентификатором. _var зарезервирован как глобальный идентификатор, а _Var (подчеркивание + заглавная буква) зарезервирован в любое время. Вот почему в C ++ вы увидите людей, которые вместо этого используют соглашение var_.
источник
Вы можете создать свои собственные правила кодирования. Просто напишите четкую документацию для остальной части команды.
Использование _field помогает Intelilsense фильтровать все переменные класса, просто набирая _.
Я обычно следую Руководящим указаниям Брэда Адамса , но он рекомендует не использовать подчеркивание.
источник
Именование стандарт Microsoft для C # говорит переменные и параметры должны использовать нижнюю форму верблюд случая IE:
paramName
. Стандарт также требует поля , чтобы следовать той же форме , но это может привести к неясному коду так много команд требуют подчеркивания префикса для улучшения ясности IE:_fieldName
.источник
В C # Руководства по проектированию Microsoft Framework предлагают не использовать символ подчеркивания для открытых членов. Для частных пользователей подчеркивания в порядке. Фактически, Джеффри Рихтер (часто цитируемый в руководящих принципах) использует, например, m_ и s_ для частных статических членов.
Лично я использую только _, чтобы пометить своих частных пользователей. «m_» и «s_» граничат с венгерской нотацией, которая не только не одобряется в .NET, но может быть довольно многословной, и я нахожу, что классы со многими членами трудно выполнить быструю проверку в алфавитном порядке (представьте 10 переменных, все начинающиеся с m_) ,
источник
Я использую именование _var для переменных-членов моих классов. Есть две основные причины, по которым я это делаю:
1) Это помогает мне отслеживать переменные класса и локальные функции, когда я читаю свой код позже.
2) Это помогает в Intellisense (или другой системе дополнения кода), когда я ищу переменную класса. Знание первого символа полезно для фильтрации списка доступных переменных и методов.
источник
Что касается языков C и C ++, то нет особого значения для подчеркивания в имени (начало, середина или конец). Это просто допустимый символ имени переменной. «Соглашения» происходят из практики кодирования в сообществе программистов.
Как уже указывалось различными примерами выше, _ в начале может означать закрытые или защищенные члены класса в C ++.
Позвольте мне привести историю, которая может быть интересной. В UNIX, если у вас есть функция библиотеки ядра C и серверная часть ядра, где вы хотите также представить функцию ядра в пространстве пользователя, _ застревает перед заглушкой функции, которая вызывает функцию ядра напрямую, не делая ничего другого. Наиболее известный и знакомый пример этого - exit () vs _exit () в ядрах типа BSD и SysV: там exit () выполняет работу с пользовательским пространством перед вызовом службы выхода ядра, тогда как _exit просто сопоставляется со службой выхода ядра.
Таким образом, _ использовался для «локальных» вещей, в данном случае локальный был машинно-локальным. Обычно _functions () не были переносимыми. В этом вы не должны ожидать одинакового поведения на разных платформах.
Теперь что касается _ в именах переменных, таких как
int _foo;
Психологически, _ - это странная вещь, которую нужно вводить в начале. Поэтому, если вы хотите создать имя переменной, которое будет иметь меньшую вероятность столкновения с чем-то другим, ОСОБЕННО при работе с заменами препроцессора, вы должны рассмотреть использование _.
Мой основной совет - всегда следовать правилам вашего сообщества программистов, чтобы вы могли сотрудничать более эффективно.
источник
Это просто означает, что это поле члена в классе.
источник
Нет конкретного соглашения об именовании, но я видел это для частных пользователей.
источник
Многим людям нравится иметь частные поля с префиксом подчеркивания. Это просто соглашение об именах.
Официальные соглашения об именах в C # предписывают простые строчные имена (без подчеркивания) для частных полей.
Я не знаю стандартных соглашений для C ++, хотя подчеркивания очень широко используются.
источник
Это просто соглашение, которое некоторые программисты используют, чтобы прояснить, когда вы манипулируете членом класса или какой-либо другой переменной (параметры, локальные для функции и т. Д.). Другое соглашение, которое также широко используется для переменных-членов, заключается в добавлении префикса имени к «m_».
В любом случае, это всего лишь соглашения, и вы не найдете единого источника для всех них. Это вопрос стиля, и у каждой команды программистов, проектов или компаний есть свои (или даже нет).
источник
Существует вполне законная причина использовать его в C #: если код должен быть также расширяемым из VB.NET. (В противном случае я бы не стал.)
Поскольку VB.NET нечувствителен к регистру,
field
в этом коде нет простого способа получить доступ к защищенному члену:Например, это получит доступ к получателю свойства, а не к полю:
Черт, я даже не могу писать
field
строчными буквами - VS 2010 просто продолжает исправлять это.Чтобы сделать его легко доступным для производных классов в VB.NET, необходимо придумать другое соглашение об именах. Префикс подчеркивания является, вероятно, наименее навязчивым и наиболее «исторически приемлемым» из них.
источник
Теперь обозначение, использующее this, как в this.foobarbaz, приемлемо для переменных-членов класса C #. Он заменяет старую нотацию "m_" или просто "__". Это делает код более читабельным, потому что нет никаких сомнений в отношении ссылок.
источник
Из моего опыта (конечно, ограниченного) подчеркивание будет указывать, что это закрытая переменная-член. Как сказал Голлум, это будет зависеть от команды.
источник
Старый вопрос, новый ответ (C #).
Другое использование символов подчеркивания для C # - это DI-ядро ASP NET Core (внедрение зависимостей). Закрытые
readonly
переменные класса, которые были присвоены внедренному интерфейсу во время построения, должны начинаться с подчеркивания. Я предполагаю, что это спор о том, использовать ли подчеркивание для каждого частного члена класса (хотя сама Microsoft следует за ним), но это однозначно.источник
Соглашение об именах, подобное этому, полезно, когда вы читаете код, особенно код, который вам не принадлежит. Сильное соглашение об именах помогает указать, где определен конкретный член, какой он член и т. Д. Большинство групп разработчиков применяют простое соглашение об именах и просто ставят префиксы полей для членов с подчеркиванием (
_fieldName
). В прошлом я использовал следующее соглашение об именах для C # (основанное на соглашениях Microsoft для кода платформы .NET, которые можно увидеть с помощью Reflector):Поле экземпляра: m_fieldName
Статическое поле: s_fieldName
Public / Protected / Internal Участник: PascalCasedName ()
Закрытый член: camelCasedName ()
Это помогает людям понять структуру, использование, доступность и местоположение участников при быстром чтении незнакомого кода.
источник