Анализаторы кода Roslyn - когда следует использовать "это"?
Я всегда был явным с моим кодом при использовании членов экземпляра, префикс их с помощью this.
и со статическими членами, префиксами их с именем типа.
Roslyn, похоже, не нравится, и вежливо предлагает, чтобы вы могли опустить this.
и Type.
из своего кода, если это необходимо...
... так что я бы сделал это... (не предназначен для каламбура)
public void DoSomethingCool()
{
this.CallAwesomeMethod();
CoolCucumber.DoSomethingLessAewsome();
}
... roslyn предлагает мне сделать это...
public void DoSomethingCool()
{
CallAwesomeMethod();
DoSomethingLessAwesome();
}
... однако, когда дело доходит до использования методов расширения, кажется, что я не могу опустить использование this.
, например...
public int GetTotal()
{
// This doesn't work
return Sum(o => o.Value);
// This does
return this.Sum(o => o.Value);
}
Вопросы:
- Почему Roslyn, похоже, не любит явное использование
this.
и Type.
?
- Почему мне нужно явно использовать
this.
для методов расширения?
- Хотя это не является строго частью этого вопроса, как я могу разрешить несоответствие между Roslyn, не желающим, чтобы я использовал анализаторы
this.
и Type.
и StyleCop, настаивая на том, что я их использую?
Ответы
Ответ 1
Вы правы в этом поведении. Это поразило меня и при использовании Visual Studio 2015, и я подумал так же, как и вы. Вот мои мысли по этому поводу:
-
Почему Roslyn не похоже на явное использование this.
и Type.
?
Это накладные расходы, и, похоже, он хочет свести к минимуму необходимый код. Я предпочитаю быть явным в своем коде. Намного легче понять масштаб переменной, не зная остальной части кода. (Возможно, это также маркетинговая стратегия, чтобы сообщить нам о анализаторе кода... Или я слишком много думаю)
-
Почему мне нужно явно использовать this.
для методов расширения?
Я предполагаю, что это правило для подачи первого параметра метода расширения, this
. Без предоставления this
он не знает контекста для вызова метода. Фактически, метод расширения this.Sum(x => x)
фактически переписан как Enumerable.Sum(this, x => x)
. См. "Необходимость" для this
? Я думаю, что упущение это технически возможно, но я предпочитаю быть явным и в этом случае, и я рад, что компилятор тоже делает.
Ответ 2
this.
- это синтаксис, который предоставляется в С# для разрешения двусмысленности. Например:
class Square
{
private int size;
public Square(int size)
{
size = size; // How do we differentiate member and parameter?
}
}
Так что с использованием this.
для явного скорее является оксюмороном, потому что он решает проблему, вызванную недостатком.
"Лучшая практика", которую я бы рекомендовал, - написать код, который не является двусмысленным в первую очередь, тем самым устраняя необходимость использования this.
. Неоднозначность не только не нравится компилятору, но и может быть очень запутанным для других программистов, пытающихся прочитать ваш код.
Чтобы достичь значения, нам нужно использовать разные имена для таких вещей, как переменные-члены и параметры. Наиболее распространенный подход (помимо this.
) заключается в использовании префиксов именования для идентификации членов. Многие программисты не любят префиксы, но обычно это потому, что они никогда не видели/не использовали хорошо продуманную систему префикса - я описал свой подход здесь, и как только вы привыкнете к нему, это очень мощный способ передачи полезной информации самому себе и вашим товарищам по команде и устранению нескольких распространенных типов ошибок, вызванных двусмысленностью и смешиванием.