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

12
我一直在使用实例成员时,在其前面加上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的分析器坚持要求我使用它们之间的差异?

2
Roslyn对于不允许你使用这个功能非常无能。我想Roslyn团队成员不需要智能感知,因为他们是聪明的程序员。但考虑到产品的质量,他们或许应该多用一下。什么时候关闭灯泡提示取决于你自己,我们无法帮助你。顺便说一句,当他们选择一个亮色背景的图标用于暗色主题时,有人显然犯了一个错误。整体效果非常不足,需要时间来改进。 - Hans Passant
3
这个检查可以在选项中轻松禁用。 - SLaks
@SLaks 我注意到我的项目中有一个.ruleset文件,其中包含了该项目的所有Roslyn和Stylecop规则:我遵循了StyleCop的建议,而不是使用Roslyn。 - Matthew Layton
在某些比较特殊的情况下,省略扩展方法中的this关键字可能会出现问题:https://dev59.com/A14c5IYBdhLWcg3weaT8#27884101 - Jeroen Vannevel
2
还要注意的是,ReSharper认为this也应该被省略。 - Jeroen Vannevel
2个回答

8
您在这个问题上是正确的。当我使用Visual Studio 2015时,我也遇到过这个问题,我和您一样感到困惑。以下是我的想法:
1.为什么Roslyn似乎不喜欢显式使用“this.”和“Type.”?
这会增加开销,而且它似乎希望最小化所需的代码。虽然如此,但我更喜欢在我的代码中明确表达。这样可以更容易地理解变量的作用范围,而无需了解其他部分的代码。(也许)这也是一种营销策略,让我们了解代码分析器......或者我想太多了。
2.为什么需要显式使用“this.”作为扩展方法的第一个参数?
我想这是提供扩展方法第一个参数“this”的规则。如果没有提供“this”,它就不知道调用方法的上下文。实际上,扩展方法“this.Sum(x => x)”实际上被重新编写为“Enumerable.Sum(this, x => x)”。看到“this”的“必要性”了吗?我想在这种情况下省略“this”是技术上可能的,但我更喜欢在这种情况下明确表达,我很高兴编译器也这样做。

1

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

class Square
{
    private int size;

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

因此,使用this.来明确表示是一种矛盾之举,因为它解决了由于缺乏明确性而引起的问题。

我建议的“最佳实践”是编写不含歧义的代码,从而消除使用this.的需要。歧义不仅不受编译器欢迎,而且对其他尝试阅读您的代码的程序员来说可能会非常困惑。

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


我相当喜欢你的链接方法。不过有一件事,对于成员级别指针,你会使用mpTarget还是pmTarget?你是否有首选的“模式”来使用“堆栈”前缀? - user5151179
谢谢!我想我的传统排序归结为“特殊修饰符”(成员/静态/易失性)和“使用信息”(指针、事件),这导致了“mp”排序。由于静态/易失性/事件通常是成员,我倾向于使用“s”而不是“ms”来保持清洁,因此对我来说,它们通常只在C/C++中(其中前缀“mp”或“pp”出现)才会超过1个字符长。 - Jason Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接