在使用实例成员时,我总是明确地使用我的代码,在前面加上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);
}
问题:
this.
和Type.
?this.
作为扩展方法?this.
和Type.
以及StyleCop的分析师坚持使用它们?答案 0 :(得分:8)
您对此行为是正确的。使用Visual Studio 2015时,它也让我感到震惊,我也想到了和你一样。以下是我对此的看法:
为什么Roslyn似乎不喜欢明确使用this.
和Type.
?
这是开销,似乎它想要最小化所需的代码。我喜欢在我的代码中明确表达。在不知道其余代码的情况下,更容易理解变量的范围。 (也许它也是让我们了解代码分析器的营销策略......或者我在想太多)
为什么我需要明确使用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,一旦你习惯了它,它就是一种非常强大的方式。向您自己和您的队友传达有用的信息,并消除由模糊和混淆引起的几种常见类型的错误。