Как вы называете ваши личные переменные в 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 #, и я хотел бы выбрать наиболее «приемлемый для отрасли» метод, чтобы попытаться войти в наш стандарт кодирования.)


Почему бы не использовать автоматически реализованные свойства? 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.

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


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;
}

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;


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.


0

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

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


0

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


0

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

private int m_myInteger;

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

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

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