Подчеркивать или не подчеркивать, вот в чем вопрос

122
задан Kev 16 January 2009 в 12:21
поделиться

10 ответов

Это будет иметь никакой эффект.

Часть рекомендаций для записи CLS-совместимых библиотек не должна иметь двух общедоступных/защищать объектов, которые отличаются только случаем, например, Вы должны НЕ , имеют

public void foo() {...}

и

public void Foo() {...}

, что Вы описываете, не проблема, потому что частный объект не доступен пользователю библиотеки

46
ответ дан Andreas Grech 16 January 2009 в 12:21
поделиться

После работы в среде, которая имела очень определенные и очень бессмысленные правила стиля с тех пор, я продолжал создавать свой собственный стиль. Это - один тип, на котором я зеркально отразил назад и вперед много. Я наконец решил, что частные поля всегда будут _field, локальные переменные никогда не будут иметь _ и будут нижним регистром, имена переменной для средств управления будут свободно следовать за Венгерской записью, и параметры обычно будут Camel-регистром.

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

6-летнее обновление: я анализировал внутренности Dictionary<TKey,T> для определенного использования параллельного доступа и неправильно читал частное поле, чтобы быть локальной переменной. Частные поля определенно не должны быть тем же соглашением о присвоении имен как локальные переменные. Если бы было подчеркивание, то это было бы невероятно очевидно.

14
ответ дан Chris Marisic 16 January 2009 в 12:21
поделиться

Взятый от Microsoft StyleCop Help file:

TypeName: FieldNamesMustNotBeginWithUnderscore

CheckId: Причина SA1309

: имя поля А в C# начинается с подчеркивания.

Описание Правила:

нарушение А этого правила происходит, когда имя поля начинается с подчеркивания.

По умолчанию, StyleCop запрещает использование символов нижнего подчеркивания, m _, и т.д., для маркировки полей локального класса, в пользу ‘this. Префикс ’. Преимущество использования ‘this. ’ - то, что это применяется одинаково ко всем типам элемента включая методы, свойства, и т.д., и не только поля, выполняя все вызовы для классификации участников, немедленно распознаваемых, независимо от которого редактор используется для просмотра кода. Другое преимущество состоит в том, что это создает быстрое, распознаваемое дифференцирование между членами экземпляра и статическими участниками, которые не будут снабжены префиксом.

, Если имя поля или имя переменной предназначаются для соответствия названию объекта, связанного с Win32 или COM, и таким образом должны начаться с подчеркивания, поместить поле или переменную в специальном классе NativeMethods. Класс NativeMethods является любым классом, который содержит имя, заканчивающееся в NativeMethods, и предназначается как заполнитель для Win32 или оберток COM. StyleCop проигнорирует это нарушение, если объект будет помещен в классе NativeMethods.

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

Редактирование: Как развитие, страница StyleCop проекта расположена здесь: http://code.msdn.microsoft.com/sourceanalysis . Прочтение справочного файла дает большое понимание, почему они предлагают различные стилистические правила.

67
ответ дан Dan Rigby 16 January 2009 в 12:21
поделиться

Так как мы говорим о частном поле, оно не влияет на пользователя Вашего класса.

, Но я рекомендую использовать подчеркивание для частного поля, потому что оно может сделать код легче понять, например:

private int foo;
public void SetFoo(int foo)
{
  // you have to prefix the private field with "this."
  this.foo = foo;

  // imagine there's lots of code here,
  // so you can't see the method signature



  // when reading the following code, you can't be sure what foo is
  // is it a private field, or a method-argument (or a local variable)??
  if (foo == x)
  {
    ..
  }
}

В нашей команде, мы всегда используем префикс подчеркивания для частных полей. Таким образом при чтении некоторого кода, я могу очень легко определить частные поля и сказать им кроме местных жителей и аргументов. В некотором смысле, подчеркивание может пчела, рассматриваемая как краткая версия "этого".

24
ответ дан M4N 16 January 2009 в 12:21
поделиться

Мне все еще действительно нравится использовать символы нижнего подчеркивания перед частными полями по причине Martin, упомянутый, и также потому что частные поля затем отсортируют вместе в IntelliSense. Это несмотря на злые из венгерских префиксных нотаций в целом.

Однако недавно я нахожу, что использование префикса подчеркивания для членов парламента, не занимающих официального поста осуждено, даже при том, что я не совсем уверен почему. Возможно, кто-то еще знает? Это - просто принцип префикса? Или было ли что-то связанное с искажением имени универсальных типов, которые получают символы нижнего подчеркивания в них в скомпилированных блоках или чем-то?

7
ответ дан peSHIr 16 January 2009 в 12:21
поделиться

Мне нравится подчеркивание, потому что затем я могу использовать строчное имя в качестве параметров метода как это:

public class Person
{
    string _firstName;

    public MyClass(string firstName)
    {
        _firstName = firstName;
    }

    public string FirstName
    {
        get { return _firstName; }
    }
}
12
ответ дан Lance Fisher 16 January 2009 в 12:21
поделиться

Я думаю, что в общем и целом поля уровня класса являются ошибкой в дизайне языка. Я предпочел бы его, если свойства C# имели свой собственный локальный объем:

public int Foo
{
   private int foo;
   get
   {
      return foo;
   }
   set
   {
      foo = value;
   }
}

, Который позволил бы прекратить использовать поля полностью.

единственное время я когда-либо снабжаю префиксом частное поле подчеркивание, когда свойство требует отдельного поля поддержки. Это - также единственное использование времени I частные поля. (И так как я никогда не использую защищенные, внутренние, или общедоступные поля, это - единственное время, я использую полевой период.), Что касается меня, если переменная должна иметь объем класса, это - свойство класса.

4
ответ дан Robert Rossney 16 January 2009 в 12:21
поделиться

_fieldName нотация для частных полей настолько легка повредиться . Используя "это". нотацию невозможно повредить. Как Вы повредились бы _ нотация? Наблюдайте:

private void MyMethod()
{
  int _myInt = 1; 
  return; 
}

Там Вы идете, я просто нарушил Ваше соглашение о присвоении имен, но оно компилирует. Я предпочел бы иметь соглашение о присвоении имен, которое это a) не венгерский и b) явный. Я выступаю за отказ с венгерским именованием, и это квалифицирует в некотором роде. Вместо типа объекта перед именем переменной у Вас есть его уровень доступа.

Контраст это с Ruby, где название переменной @my_number связи имя в объем и является небьющимся.

редактирование: Этот ответ пошел отрицательный. Я не забочусь, это остается.

3
ответ дан jcollum 16 January 2009 в 12:21
поделиться

Когда Вы хотите, чтобы Ваш блок был CLS-совместим, можно использовать атрибут CLSCompliant в assemblyinfo файле. Компилятор будет затем жаловаться, когда Ваш код будет содержать материал, который не является cls совместимый.

Затем когда у Вас есть 2 свойства, которые только отличаются в случае, если, компилятор выпустит ошибку. С другой стороны, когда у Вас есть частное поле и общественная собственность в том же классе, не будет никаких проблем.

(Но, я также всегда снабжаю префиксом своих членов парламента, не занимающих официального поста подчеркивание. Это также помогает мне прояснить, когда я прочитал свой код, что определенная переменная является членским полем).

1
ответ дан Frederik Gheysels 16 January 2009 в 12:21
поделиться

Мне нравится использовать символы нижнего подчеркивания перед моими частными полями по двум причинам. Каждый был уже упомянут, поля стоят из своих связанных свойств в коде и в Intellisense. Вторая причина состоит в том, что я могу использовать те же соглашения о присвоении имен, кодирую ли я в VB или C#.

0
ответ дан Rob Windsor 16 January 2009 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: