Почему StyleCop рекомендует использовать метод префикса или свойства с помощью "this"?

Я пытаюсь следовать рекомендациям StyleCop по проекту, чтобы узнать, был ли в конечном итоге улучшенный код. Большинство правил являются разумными или имеют отношение к стандарту кодирования, но есть одно правило, которое меня озадачивает, потому что я не видел, чтобы кто-то еще его рекомендовал, и потому, что я не вижу в этом явных преимуществ:

SA1101: вызов {метод или имя свойства} должен начинаться с "this." чтобы указать, что элемент является членом класса.

С другой стороны, код явно более подробен таким образом, так в чем преимущества следующего правила? Кто-нибудь здесь придерживается этого правила?

Ответ 1

Он может сделать код более понятным с первого взгляда. Когда вы используете this, проще:

  • Сообщите статическим и членам экземпляра отдельно. (И отличить методы экземпляра от делегатов.)
  • Различать члены экземпляра от локальных переменных и параметров (без использования соглашения об именах).

Ответ 2

Я действительно не следую этому руководству, если я не вхожу в сценарий, который вам нужен:

  • существует реальная двусмысленность - в основном, что влияет на конструкторы (this.name = name;) или такие вещи, как Equals (return this.id == other.id;)
  • вы хотите передать ссылку на текущий экземпляр
  • вы хотите вызвать метод расширения для текущего экземпляра

Кроме этого, я считаю этот беспорядок. Поэтому я отключу правило.

Ответ 3

Я думаю, эта статья немного объясняет это

http://blogs.msdn.microsoft.com/sourceanalysis/archive/2008/05/25/a-difference-of-style.aspx

... блестящий молодой разработчик в Microsoft (хорошо, это был я) решил взять на себя задачу написать небольшой инструмент, который мог бы обнаружить отклонения от стиля С#, используемого в его команде. StyleCop родился. В течение следующих нескольких лет мы собрали все руководящие принципы стиля С#, которые мы могли найти в различных командах Microsoft, и выбрали все передовые методы, которые были общими для этих стилей. Они сформировали первый набор правил StyleCop. Одним из самых ранних правил, которые исходили из этих усилий, было использование префикса this для вызова членов класса и удаления любых префиксов подчеркивания из имен полей. Стиль С# официально вырос отдельно от своего старого племени С++.

Ответ 4

Обратите внимание, что компилятору все равно, используете ли вы префиксные ссылки с помощью this или нет (если нет столкновений имен с локальной переменной и поля или вы хотите вызвать метод расширения в текущем экземпляре.)

Это до вашего стиля. Лично я удаляю this. из кода, поскольку я думаю, что он уменьшает отношение сигнал/шум.

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

  • имена типов находятся в PascalCase
  • имена параметров находятся в camelCase
  • интерфейсы должны иметь префикс с буквой I
  • использовать уникальные имена для перечислений, за исключением тех случаев, когда они [Флаги]

... но то, что происходит в частных сферах вашего кода, - это, конечно, личное. Сделайте то, что ваша команда соглашается.

Также важна согласованность. Это уменьшает когнитивную нагрузку при чтении кода, особенно если стиль кода такой, как вы ожидаете. Но даже при работе с иностранным стилем кодирования, если он последователен, для его использования не потребуется много времени. Используйте инструменты, такие как ReSharper и StyleCop, чтобы обеспечить согласованность, когда вы считаете это важным.

Использование .NET Reflector предполагает, что Microsoft не так хороша в том, чтобы придерживаться стандартов кодирования StyleCop в BCL в любом случае.

Ответ 5

this.This 
this.Does 
this.Not 
this.Add 
this.Clarity 
this.Nor 
this.Does 
this.This 
this.Add 
this.Maintainability 
this.To 
this.Code

Использование "этого" при чрезмерном или вынужденном требовании стиля является не чем иным, как приспособлением, используемым под видом, 1% разработчиков, которые действительно не понимают код или что делают, и делает его болезненным для 99%, которые хотят писать легко читаемый и поддерживаемый код.

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

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

Любой разработчик, который по сути не понимает объем статического, локального, классового или глобального контента, не должен полагаться на "подсказки" для указания области. "это." хуже венгерской нотации, так как по крайней мере венгерская нотация дала представление о типе, который переменная ссылается, и приносит некоторую пользу. Я предпочел бы видеть, что "_" или "m" используется для обозначения членов класса класса, чтобы увидеть "это" . во всем мире.

У меня никогда не было проблемы и не было проблемы с другим разработчиком, который неоднократно борется с областью кода или пишет код, который всегда глючит из-за того, что не используется "это" . в явном виде. Это необоснованный страх, что "это" . предотвращает будущие ошибки кода и часто является аргументом, используемым там, где оценивается невежество.

Кодеры растут с опытом, "это" . походит на то, чтобы попросить кого-то посадить тренировочные колеса на своем велосипеде как взрослого, потому что это то, что они сначала должны были использовать, чтобы научиться кататься на велосипеде. И взрослые могут упасть с байка 1 в 1000 раз, когда они попадают на него, но это не повод заставить их использовать тренировочные колеса.

"это." должен быть запрещен из определения языка для С#, к сожалению, есть только одна причина для его использования, и это должно устранить неоднозначность, которая также может быть легко устранена с помощью более эффективных методов кода.

Ответ 6

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

1) Ясность. В этот момент вы знаете, какие переменные вы указали в определении класса и которые вы указали как locals, parameters и whatnot. Через два года вы не узнаете этого, и вы отправитесь в чудесное путешествие повторного открытия, которое абсолютно бессмысленно и не требуется, если вы конкретно укажете родителя на фронт. Кто-то другой, работающий над вашим кодом, не имеет никакого представления об этом, и, следовательно, мгновенно получает выгоду.

2) Intellisense. Если вы наберете "это". вы получаете все справки о конкретном экземпляре и свойства в справке. Это облегчает поиск вещей, особенно если вы поддерживаете код другого пользователя или код, который вы не просматривали через пару лет. Это также помогает избежать ошибок, вызванных неправильными представлениями о том, какие переменные и методы объявлены где и как. Это может помочь вам обнаружить ошибки, которые в противном случае не появлялись бы до тех пор, пока компилятор не задохнулся от вашего кода.

3). Вы можете добиться такого же эффекта, используя префиксы и другие методы, но это ставит вопрос о том, почему вы должны изобрести механизм для решения проблемы, когда есть механизм, чтобы сделать это встроенным в язык, который на самом деле поддерживаемый IDE? Если вы прикоснетесь к типу, даже частично, это, в конечном счете, также снизит частоту ошибок, не заставив вас вывести свои пальцы из исходного положения, чтобы перейти к значку подчеркивания.

Я вижу много молодых программистов, которые делают большую сделку из того времени, когда они будут экономить, не набрав ни одного персонажа. Большая часть вашего времени будет потрачена на отладку, а не на кодирование. Не беспокойтесь о скорости ввода. Беспокоитесь больше о том, как быстро вы можете понять, что происходит в коде. Если вы сохраняете в общей сложности пять минут кодирования и выигрываете тратить дополнительные 10 минут отладки, вы замедлили себя, независимо от того, насколько быстро вы выглядите, как будто вы идете.

Ответ 7

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

И, конечно, я должен использовать его в своих конструкторах, потому что обычно я предоставляю параметрам конструктора те же имена, что и поля, на которые их значения присваиваются. Поэтому мне нужно "this" для доступа к полям.

Ответ 8

Кроме того, можно дублировать имена переменных в функции, поэтому использование 'this' может сделать ее более ясной.

class foo {
  private string aString;

  public void SetString(string aString){
    //this.aString refers to the class field
    //aString refers to the method parameter        
    this.aString = aString; 
  }
}

Ответ 9

Я следую за ним в основном по причинам intellisense. Это так приятно печатать this. и получать список свойств, методов и т.д.