Roslyn代码分析器-我应该在什么时候使用“;这个&”;

本文关键字:这个 什么时候 分析器 代码 我应该 Roslyn | 更新日期: 2023-09-27 18:21:34

在使用实例成员时,我总是对代码进行显式处理,在它们前面加上this.和静态成员,在它们之前加上类型名。

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

所以我会在哪里做这个(无意双关)

public void DoSomethingCool()
{
    this.CallAwesomeMethod();
    CoolCucumber.DoSomethingLessAewsome();
}

罗斯林建议我这样做。。。

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的分析器坚持让我使用它们之间的差异

Roslyn代码分析器-我应该在什么时候使用“;这个&”;

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

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

    这是一种开销,而且它似乎想尽量减少所需的代码。不过,我更喜欢在代码中显式。在不了解其余代码的情况下,理解变量的范围要容易得多。(也许这也是一种营销策略,让我们了解代码分析器…或者我想得太多了吗)

  2. 为什么我需要显式地将this.用于扩展方法?

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

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

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

因此,使用this.显式是一种矛盾修饰法,因为它解决了由缺乏明确性引起的问题。

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

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