我能强制在C# .NET中使用“this”关键字吗?

11
有没有一种方法可以在使用当前实例成员时,在 Visual Studio 中强制使用 this 关键字?
构造函数中有一个错误的示例:
class MyClass
{
    public object Foo { get; set; }
    public MyClass(object foo)
    {
        Foo = Foo; // this should of course be lowercase but it's easy to miss
    }
}

这段代码很可能会在稍后某个地方生成臭名昭著的'object reference not set to an instance of an object'异常。

如何让它工作但仍然容易忽略:

class MyClass
{
    public object Foo { get; set; }
    public MyClass(object foo)
    {
        Foo = foo; // Valid syntax but unclear.
    }
}

这是有效的语法,但很容易被忽略。

我想让Visual Studio强制执行的语法:

class MyClass
{
    public object Foo { get; set; }
    public MyClass(object foo)
    {
        this.Foo = foo; // this is "safe". 
    }
}
如果遵循这种约定,我将不得不键入this.Foo = this.Foo来创建与第一个示例中相同类型的错误。
无论如何,我总是使用this关键字,因为它可以使我在c#和其他语言之间轻松切换,所以根本没有任何缺点。

2
如果您使用fxcop,Visual Studio会在您第一次犯错误时发出警告。 - Oskar Kjellin
正如你所说,我认为这对你遇到的问题没有任何影响,我建议改变参数名称,比如改成 bar,这样你就不会有任何问题了。 - atoMerz
5个回答

11

您可以通过启用"将警告视为错误"来轻松解决此问题:

警告2:对相同变量进行了赋值;您是否意味着要分配其他内容?

(如果您只想为此启用它,则为CS1717)

编译器已经向您报告了这个问题;您应该查看警告并力争达到零警告。

关于中间的那个不清楚:

Foo = foo;

我不同意- 对我来说这非常清晰(除非你来自VB背景并且有大小写盲区)。


2
他的意思是,如果你想表达的是this.Foo,那么你永远不能写成Foo,就像第二个例子中你所想表达的那样。因此,他的方法可以捕捉到这种错误。 - Oskar Kjellin
确实,但你写的是它仍然会是一个错误,这是不正确的。 - Oskar Kjellin
是的,感觉现在更相关了。 - Oskar Kjellin
谢谢!我正在重构一个大项目,所以有100多个“xxx已过时”警告,所以我想我可能错过了它。我完全同意,在交付时应该没有任何警告。 - Jonas Stensved
@Jonas - 如果有帮助的话,你可以针对每个错误启用“警告作为错误”。 - Marc Gravell
显示剩余4条评论

6

不,您不能通过这种方式改变语言的行为。如果您使用 ReSharper,我相信您可以告诉它标记此类问题——它可能不会在错误列表中显示,但会在边缘和整个文件健康状态的“指示灯”中显示。

个人而言,我通常对这种事情并不太担心,因为一旦测试就很明显——我只能回忆起一个场景真正让我遇到了问题,那是当我最终在 Windows Phone 7 上运行时,在类型初始化器内遇到堆栈溢出(虽然不是完全相同的情况,但同样涉及大小写问题)——基本上是由于复杂的调试环境造成的。


我同意,我在单元测试时想出了这个想法,所以它并不重要。我只是认为这将是一个“很好有的”功能。 - Jonas Stensved

3
您可以使用StyleCop生成警告,如果您没有加前缀,您可以按照这些说明将StyleCop作为构建过程的一部分运行。
StyleCop带有一堆默认规则,其中许多都很糟糕,但是您可以编辑规则文件,使其最适合您的开发人员。您还可以共享StyleCop文件,以便立即将更改复制到所有开发人员。
它是一个相当不错的解决方案,由Microsoft免费提供,如果您想出一个合适的规则集,那么您的开发人员将创建更 "整洁 "的代码。您还可以创建自定义规则,例如“方法长度不能太长”,在其中定义长度。有很多东西可以玩。
此外,我想您可以将警告设置为错误,但如果您这样做,请确保您的StyleCop设置完全符合您的要求。

多好的工具啊!我之前用过FxCop,但这个是一个很好的补充。 - Jonas Stensved

2
您可以使用StyleCopAnalyzers,规则SA1101

原因:

在C#代码文件中,对本地类或基类的实例成员的调用没有加上“this.”前缀。

然后您可以右键单击解决方案资源管理器中的规则,并将其设置为错误,这样如果没有使用“this”,它就无法编译。


2
您可以使用FXCop\Visual Studio Code Analysis创建自定义警告和错误。

2
存在编译器警告,不需要自定义规则。 - Marc Gravell
我的意思是,您可以创建一个自定义警告,以便在访问本地属性时没有使用“this”关键字时进行通知。 - sternr
如果你想要严谨一些,那就这么做。+1 - Jonathan Dickinson

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