ВАЖНОЕ ОБНОВЛЕНИЕ (12 апреля 2016 г.):
Мы обратили внимание на то, что внутренний стандарт команды .NET CoreFX настаивает на использовании символа подчеркивания без объяснения причин. Однако , если мы внимательно посмотрим на правила # 3 становится очевидным , что существует система _, t_, s_префиксов, предполагает , почему _был выбран в первую очередь.
- Мы используем
_camelCaseвнутренние и частные поля и используем только чтение там, где это возможно. Префикс полей экземпляра с _, статические поля с s_и поток статических полей с t_. При использовании в статических полях readonlyдолжен стоять после static(т. Е. static readonlyНет readonly static).
- Мы избегаем без
this.крайней необходимости.
Итак, если вы, как команда .NET CoreFX, работаете над некоторым критически важным для производительности многопоточным кодом системного уровня , то НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ:
- придерживаться своих стандартов кодирования и
- используйте нижнее подчеркивание и
- не читайте этот ответ дальше
В противном случае читайте дальше ...
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Давайте сначала договоримся о том, о чем мы говорим. Вопрос в том, как мы получаем доступ к членам экземпляра из нестатических методов и конструкторов класса / подклассов, если модификаторы видимости позволяют это сделать.
Подчеркивание-обозначение
- предлагает использовать префикс "_" в именах закрытых полей
- он также говорит, что вы никогда не должны использовать "this", если это абсолютно необходимо.
Это-обозначение
- предлагает вам просто всегда использовать «это». для доступа к любому члену экземпляра
Почему существует это обозначение?
Потому что это то, как ты
- отличить параметр от поля, если у них одно и то же имя
- убедитесь, что вы работаете в контексте текущего экземпляра
пример
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
Почему существует символ подчеркивания?
Некоторым людям не нравится печатать «это», но им все равно нужен способ различать поле и параметр, поэтому они согласились использовать «_» перед полем.
пример
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Можно подумать, что дело в личном вкусе, и оба варианта одинаково хороши или плохи. Однако есть определенные аспекты, в которых эта нотация превосходит нотацию подчеркивания:
ясность
- символы подчеркивания заглушают имена
- this-notation сохраняет имена нетронутыми
Познавательная нагрузка
нотация подчеркивания непоследовательна, она заставляет вас обращаться с полями особым образом, но вы не можете использовать ее с другими членами, каждый раз, когда вам нужно спрашивать себя, нужно ли вам свойство или поле
эта-нотация согласована, вам не нужно думать, вы просто всегда используете "this" для обозначения любого члена
ОБНОВЛЕНИЕ: как было указано, следующее не является преимуществом
Обслуживание
нотация подчеркивания требует, чтобы вы внимательно следили за _рефакторингом, например, превращая поле в свойство (удалить _) или наоборот (добавить _)
this-notation не имеет такой проблемы
Автозаполнение
Когда вам нужно увидеть список членов экземпляра:
- нотация подчеркивания не очень помогает, потому что, когда вы набираете "_", всплывающее окно автозаполнения показывает вам частные поля и все типы, доступные из связанных сборок, смешанные с остальными членами экземпляра
- this-notation дает вам четкий ответ, набрав "this", вы видите только список участников и ничего больше
неоднозначность
Иногда приходится иметь дело с кодом без помощи Intellisense. Например, когда вы проводите обзор кода или просматриваете исходный код в Интернете.
нотация подчеркивания неоднозначна: когда вы видите Something.SomethingElse, вы не можете определить, является ли Something классом, а SomethingElse - его статическим свойством ... или, может быть, Something является свойством текущего экземпляра, которое имеет собственное свойство SomethingElse
Эта нотация ясна: когда вы видите Something.SomethingElse, это может означать только класс со статическим свойством, и когда вы видите this.Something.SomethingElse, вы знаете, что Something является членом, а SomethingElse - его свойством
Методы расширения
Вы не можете использовать методы расширения в самом экземпляре, не используя this.
- нотация подчеркивания требует, чтобы вы не использовали "this", однако с методами расширения вы должны
- Эта-нотация избавляет вас от колебаний, вы всегда используете «это», точка.
Поддержка Visual Studio
Официальные рекомендации
Существует множество официальных правил, в которых четко сказано «не использовать символы подчеркивания», особенно в C #.