Roslyn 代码分析器 - 我应该什么时候使用 "this."?

Roslyn code analyzers - when should I use "this."?

在使用实例成员时,我的代码总是很明确,在它们前面加上 this. 和静态成员,在它们前面加上类型名称。

Roslyn 似乎不喜欢这样,并礼貌地建议您可以在代码中适当地省略 this.Type....

...所以我会在哪里做 this... (没有双关语意)

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);
}

问题:

  1. 为什么 Roslyn 似乎不喜欢显式使用 this.Type.
  2. 为什么我需要明确使用 this. 作为扩展方法?
  3. 虽然严格来说不是这个问题的一部分,但我该如何解决 Roslyn 不希望我使用 this.Type. 与 StyleCop 的分析器坚持我使用它们之间的差异?

您对此行为的看法是正确的。使用 Visual Studio 2015 时,它也让我印象深刻,我和你一样想知道。以下是我对此的看法:

  1. 为什么 Roslyn 似乎不喜欢显式使用 this.Type.

    这是开销,看来是想尽量减少所需的代码。不过,我更喜欢在我的代码中明确说明。在不知道其余代码的情况下理解变量的范围要容易得多。 (也许让我们了解代码分析器也是一种营销策略......还是我想多了)

  2. 为什么我需要显式使用 this. 作为扩展方法?

    我想这是提供扩展方法第一个参数 this 的规则。不提供 this 它不知道调用方法的上下文。实际上,扩展方法this.Sum(x => x)实际上被重写为Enumerable.Sum(this, x => x)。看到 this 的 'need' 了吗?我想省略这在技术上是可行的,但在这种情况下我也更愿意明确说明,我很高兴编译器也这样做了。

this. 是 C# 中提供的语法,用于 解决歧义 。例如:

class Square
{
    private int size;

    public Square(int size)
    {
        size = size;      // How do we differentiate member and parameter?
    }
}

所以使用this.是明确的相当矛盾,因为它正在解决由缺乏引起的问题明确性。

我推荐的'best practice'是一开始就编写没有歧义的代码,这样就不需要使用this.。歧义不仅不被编译器所喜欢,而且对于试图阅读您的代码的其他程序员来说也是极其混乱的。

为了消除歧义,我们需要对成员变量和参数等使用不同的名称。最常见的方法(this. 除外)是使用命名前缀来标识成员。许多程序员不喜欢前缀,但这通常是因为他们从来没有 seen/used 一个设计良好的前缀系统 - 我已经描述了我的方法 here,一旦你习惯了它,它就是一个非常强大的方式向您自己和您的队友传达有用的信息,并消除由歧义和混淆引起的几种常见类型的错误。