我可以强制在c#.NET中使用'this'关键字吗?

Jon*_*ved 10 c# syntax conventions visual-studio-2010 visual-studio

有没有办法this在引用当前实例成员时强制在Visual Studio中使用关键字?

示例中包含构造函数中的错误:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码可能会在'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.
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有效的语法,但很容易错过.

我希望visual studio强制执行的语法:

class MyClass
{
    public object Foo { get; set; }
    public MyClass(object foo)
    {
        this.Foo = foo; // this is "safe". 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果强制执行此约定,则必须键入this.Foo = this.Foo以创建与第一个示例中相同类型的错误.

我总是使用this关键字,因为它在c#和其他语言之间切换时让我的生活更轻松,所以根本没有任何缺点.

Mar*_*ell 11

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

警告2对同一变量进行的赋值; 你的意思是分配其他东西吗?

(CS1717,如果你想只为这个启用它)

编译器已经告诉你这个; 你应该检查警告(并针对零警告).

中间的一个不清楚:

Foo = foo;
Run Code Online (Sandbox Code Playgroud)

我不同意 - 这对我来说非常清楚(除非你来自VB背景并且已经发展了案例盲).

  • 他的意思是,如果你的意思是'this.Foo`,你永远不会写'Foo`,你在第二个例子中的意思.所以他的方式会抓住那个 (2认同)
  • 为"案例盲"+1,并给出一个很好的答案. (2认同)

Jon*_*eet 6

不,你不能像这样改变语言的行为.如果您使用ReSharper,我相信您可以告诉它标记此类事情 - 它可能不会出现在错误列表中,而是出现在边距和整个文件运行状况的"指示灯"中.

我个人并不倾向于在这种情况下失去太多的睡眠,因为一旦你测试它通常是显而易见的 - 我只记得一个它真的被我咬伤的情况,这是当我最终堆栈溢出时(在Windows Phone 7上运行的类型初始化程序中,不完全相同的情况,但同样是一个套管问题 - 基本上是混乱的调试环境.