Как вы называете ваши личные переменные в C #? [закрыто]

25

Какова лучшая практика, наиболее распространенные соглашения об именах для частных переменных в C #?

  1. private int myInteger;
  2. private int MyInteger;
  3. private int mMyInteger;
  4. private int _myInteger;
  5. private int _MyInteger;
  6. Таинственный другой вариант

Что вы используете и почему? (Моя компания довольно плохо знакома с C #, и я хотел бы выбрать наиболее «приемлемый для отрасли» метод, чтобы попытаться войти в наш стандарт кодирования.)

Vaccano
источник
Почему бы не использовать автоматически реализованные свойства? msdn.microsoft.com/en-us/library/bb384054.aspx
Кайл Баллард,
1
C # имеет стандарты для этого, см stackoverflow.com/questions/14967/...
Тамара Wijsman
7
Не очень приятно говорить о закрытых переменных публично. Извините, просто пришлось.
Марк C
Я использую то же самое, что и azheglov (m_someVariable), за исключением того, что я использую только метод _someVariable в локальной области видимости для метода.
лорд-фу
7
@ Марк Я думаю, что это должны быть "частные участники", чтобы это было наводящим на размышления.
EpsilonVector

Ответы:

44

Руководства по проектированию классов MSDN http://msdn.microsoft.com/en-us/library/ta31s3bc.aspx рекомендует вариант 1 - myInteger.

Я всегда использовал этот стиль. У меня есть личная неприязнь к персонажу _.

btlog
источник
1
Мне не нравился символ _, пока resharper не добавил середину строки, совпадающую с интеллектом. Теперь я могу напечатать, myIntegerи это будет соответствовать _myInteger. Но я не знал, что MSDS говорит не использовать _
Vaccano
4
Если вы используете вариант 1, как я могу определить, myIntegerявляется ли переменная локальной для метода или членом частного класса?
Wizard79
4
@Lorenzo this.myInteger;)
TWith2Sugars
12
Но, но ... "это" 4 символа, а "_" только один! На самом деле, это руководство имеет большой смысл, но в моем офисе все любят подчеркивать и ненавидят видеть "this.Foo" по любой причине. Иногда важны только те рекомендации, которые навязывают вам ваши рабочие места.
CodexArcanum
2
Аргумент о количестве символов является дискуссионным. Вам не нужно вводить thisкаждый раз, только в тех методах, где присутствует локальная переменная с тем же именем. Тем не менее, вы должны писать дополнительный символ каждый раз, когда вы используете подчеркивание. Я согласен с тем, что всегда важно придерживаться местного соглашения о стиле кода.
Малкольм
25

Я использую вариант № 4 выше:

private int _myInteger;

Мне нравится иметь некоторую индикацию области видимости в моих именах переменных, и для этого достаточно подчеркивания. Это также довольно легко читать.

Мэтт Диллард
источник
5
Я не согласен с тем, что его легко читать, особенно если вам приходится работать с несколькими переменными.
Рестута,
15

Я использую следующую схему именования:

  • 1-е (myInteger) для локальных переменных области
  • 2-й (MyInteger) для публичных объектов
  • 4-е (_myInteger) для приватных переменных
Зафер
источник
14

Я думаю, что вариант 4 действительно самый читаемый вариант. Это помогает вам сделать это:

public Person(string name, int age) 
{
    this.name = name;
    this.age = age;
}

Это также делает всех частных членов более заметными. В следующем примере, откуда черт возьми age? Без thisклассификатора это сложнее сказать.

private void Method()
{
    var x = 2;
    var y = age + x;
}

Это легче понять:

private void Method()
{
    var x = 2;
    var y = _age + x;
}
ChaosPandion
источник
1
Раньше я ругал твой первый пример, но после того, как какое-то время попробовал вариант # 4, я предпочитаю использовать подчеркивание в качестве префикса для приватных полей.
Джереми Уиб
2
Я говорю, используйте 1 для частных переменных, используйте 4 для частных переменных, используемых в свойствах.
Эван Плейс
2
Я должен не согласиться с ChaosPandoin. Для меня обе реализации метода () легко читаются. Как только я вижу переменную age (или _age) и замечаю, что она не объявлена ​​в методе, я понимаю, что она должна быть объявлена ​​в другом месте класса. Классификатор this ужасен, но, по крайней мере, он ограничен методом конструктора.
Дэвид Кеннеди
10

Прежде всего, PascalCasing обычно зарезервирован для открытых свойств, констант, методов и т. Д. Класса. Так что я бы пропустил 2 и 5.

Во-вторых, венгерская нотация не приветствуется в мире .NET, поэтому (ну, я думаю) 3 - правильная. Предполагая, что это то, что происходит с 3.

Это выходит с CamelCasing и _camelCasing. Я обычно использую _camelCasing для переменных класса, и обычный старый camelCasing для переменных, ограниченных методом или более узким. Оболочка верблюда является общепринятым стандартом, используемым для аргументов метода, имен защищенных / закрытых переменных и переменных внутри метода или более узкой области.

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

Сорвал
источник
2
Я не понимаю, почему вы должны использовать _camelCasing для переменных класса, поскольку обычно очевидно, что они являются переменными класса.
альтернатива
1
@ нет, это не очевидно в intellisense. Помните, что поля (переменные в области класса) имеют (почти) тот же значок, что и переменные в области метода, поэтому они выглядят точно так же, если вы не присмотритесь. Подчеркивание помогает визуально дифференцировать их и объединяет в группы, что помогает, если вы не часто их используете (что не должно быть, так как состояние является врагом программирования без ошибок).
Сорвано
Я никогда ничего не говорил о Intellisense. Я говорю о разнице между Color.ClassMethod () и myColor.InstanceMethod (), а именно о том, что должно быть очевидно, что поскольку Color является классом, ClassMethod () является методом класса.
альтернатива
@ тебя раньше: I don't understand why you would use _camelCasing for class variables ты после: I'm talking about the difference between Color.ClassMethod() and myColor.InstanceMethod()извините, пока я в замешательстве. Послушайте, я редко использую переменные класса, так что приятно вспомнить их имена, нажав _ и заставив их всплыть в интеллигентном порядке и сгруппировать.
Сорвано
2
@mathepic: Когда Уилл говорит «переменные класса», он имеет в виду (частные) поля экземпляра. Вы, кажется, истолковали то, что он сказал, чтобы иметь в виду статические члены; но это не то, что он сказал.
Дэн Тао
4

private int integer

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

Райан Робертс
источник
+1: вот что я считаю суть. Кстати, я вижу его источник, но название integerможет быть лучше перефразировано, может быть value?
Wolf
2

Я считаю, что лучший способ сделать это (в любом случае в C # /. Net) - это сочетание 2 и 6:

private int MyInteger { get; set; }

Здесь теоретически нет никакой переменной, но она выглядит и действует как частная переменная экземпляра. Если нам нужно добавить некоторую бизнес-логику к этому значению (это полностью внутреннее значение, так что мы можем все, что мы хотим для него сделать в конце концов), то это уже «для нас». Горячий дымящийся кубок победы!

задача
источник
2

Я выбрал вариант № 4, потому что именно так выглядит SSCLI, но, честно говоря, меня не особо заботит наименование приватной переменной. Публика - это другая история.

Кстати, вы забыли m_MyInteger

Конрад Фрикс
источник
2

Я бы не назвал это "моим" чем-либо!

Но я бы сказал

class C
{
     int VariableName { get; set; }
}

довольно часто это лучше, чем наличие явных переменных. Если бы у меня была явная приватная переменная, я бы назвал ееint _variableName;

CJBrew
источник
1

В C ++ я склонен использовать _, поскольку я часто переключаю редакторы, что не позволяет мне увидеть, является ли это приватным.

Для C # я склонен не использовать _, поскольку Visual Studio позволяет мне увидеть, является ли он закрытым.

Я склонен использовать Camel Case, чтобы сделать это.

Тамара Вийсман
источник
1

Я использую 4 ( private int _myInteger;), потому что:

private int myInteger;

Вот как я называю свои локальные переменные.

private int MyInteger;

Вот как я называю константы.

private int mMyInteger;

Это не стиль C #.

private int _MyInteger;

Это выглядит странно

Виктор Хурдугачи
источник
1

с подчеркиванием.

Билл Вагнер объясняет, почему в Effective C # . Но я бы никогда не назвал целое число моим Integer , лучше что-то вроде _age или _length. Включение TypeName в имя экземпляра - ужасная практика. Имена должны быть самоочевидными, и, поскольку C # является типобезопасным типом, его можно найти в любое время.

Каспар Кляйне
источник
1
Да, это был пример.
Ваккано
1

Вам нужно привести более конкретный пример, но:

private int count, private int badFileCount,private static readonly int ReconnectAttemptsLimit

Кстати, вы получаете все это БЕСПЛАТНО, когда вы устанавливаете и начинаете использовать новейшие и лучшие MSFT Stylecop.

работа
источник
0

Я иду по варианту 5: private int _MyFoo

Я не вижу никакого реального конкурентного преимущества перед _myFoo.

Mafu
источник
0

Используйте camelCasing для частных переменных, таких как myInteger

Рассмотрим предыдущее, _если переменная является резервной копией свойства, чтобы уменьшить путаницу.
Переменная _myPropertyдля свойстваMyProperty

Gulshan
источник
0

У меня есть ReSharper, который называет мои переменные, не только мои, но и все остальные. Существует большое количество последовательности в рамках проекта.

Sevki
источник
0

Стандарт кодирования IDesign C # Ювала Лоуи довольно популярен. Этот стандарт рекомендует ставить префикс закрытых членских переменных с помощью «m_» (опция 6). Это то, что мы делаем в нашей команде.

private int m_myInteger;

Вариант 4 ( _myInteger) является приемлемым вариантом данного стандарта.

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

azheglov
источник