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);
}
问题:
- 为什么 Roslyn 似乎不喜欢显式使用
this.
和 Type.
?
- 为什么我需要明确使用
this.
作为扩展方法?
- 虽然严格来说不是这个问题的一部分,但我该如何解决 Roslyn 不希望我使用
this.
和 Type.
与 StyleCop 的分析器坚持我使用它们之间的差异?
您对此行为的看法是正确的。使用 Visual Studio 2015 时,它也让我印象深刻,我和你一样想知道。以下是我对此的看法:
为什么 Roslyn 似乎不喜欢显式使用 this.
和 Type.
?
这是开销,看来是想尽量减少所需的代码。不过,我更喜欢在我的代码中明确说明。在不知道其余代码的情况下理解变量的范围要容易得多。 (也许让我们了解代码分析器也是一种营销策略......还是我想多了)
为什么我需要显式使用 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,一旦你习惯了它,它就是一个非常强大的方式向您自己和您的队友传达有用的信息,并消除由歧义和混淆引起的几种常见类型的错误。
在使用实例成员时,我的代码总是很明确,在它们前面加上 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);
}
问题:
- 为什么 Roslyn 似乎不喜欢显式使用
this.
和Type.
? - 为什么我需要明确使用
this.
作为扩展方法? - 虽然严格来说不是这个问题的一部分,但我该如何解决 Roslyn 不希望我使用
this.
和Type.
与 StyleCop 的分析器坚持我使用它们之间的差异?
您对此行为的看法是正确的。使用 Visual Studio 2015 时,它也让我印象深刻,我和你一样想知道。以下是我对此的看法:
为什么 Roslyn 似乎不喜欢显式使用
this.
和Type.
?这是开销,看来是想尽量减少所需的代码。不过,我更喜欢在我的代码中明确说明。在不知道其余代码的情况下理解变量的范围要容易得多。 (也许让我们了解代码分析器也是一种营销策略......还是我想多了)
为什么我需要显式使用
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,一旦你习惯了它,它就是一个非常强大的方式向您自己和您的队友传达有用的信息,并消除由歧义和混淆引起的几种常见类型的错误。