Roslyn代码分析器 - 我应该何时使用"这个。"?

时间:2015-11-11 14:04:29

标签: c# .net roslyn c#-6.0 roslyn-code-analysis

在使用实例成员时,我总是明确地使用我的代码,在前面加上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);
}

问题:

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

2 个答案:

答案 0 :(得分:8)

您对此行为是正确的。使用Visual Studio 2015时,它也让我感到震惊,我也想到了和你一样。以下是我对此的看法:

  1. 为什么Roslyn似乎不喜欢明确使用this.Type.

    这是开销,似乎它想要最小化所需的代码。我喜欢在我的代码中明确表达。在不知道其余代码的情况下,更容易理解变量的范围。 (也许它也是让我们了解代码分析器的营销策略......或者我在想太多)

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

    我想这是提供扩展方法的第一个参数this的规则。如果不提供this,则不知道调用该方法的上下文。实际上,扩展方法this.Sum(x => x)实际上被重写为Enumerable.Sum(this, x => x)。查看'需要' this?我想在技术上可以省略这一点,但我更喜欢在这种情况下明确,我很高兴编译器也这样做。

答案 1 :(得分:1)

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

class Square
{
    private int size;

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

所以使用this.来明确是一种矛盾,因为它解决了由缺乏的显性造成的问题。

最佳实践'我建议首先编写一些不含糊的代码,这样就无需使用this.。编译器不仅不喜欢歧义,而且对于试图读取代码的其他程序员来说,这可能会让人非常困惑。

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