Подтвердить что ты не робот

Анализаторы кода 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, настаивая на том, что я их использую?
4b9b3361

Ответ 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.) заключается в использовании префиксов именования для идентификации членов. Многие программисты не любят префиксы, но обычно это потому, что они никогда не видели/не использовали хорошо продуманную систему префикса - я описал свой подход здесь, и как только вы привыкнете к нему, это очень мощный способ передачи полезной информации самому себе и вашим товарищам по команде и устранению нескольких распространенных типов ошибок, вызванных двусмысленностью и смешиванием.