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背景并且已经发展了案例盲).
不,你不能像这样改变语言的行为.如果您使用ReSharper,我相信您可以告诉它标记此类事情 - 它可能不会出现在错误列表中,而是出现在边距和整个文件运行状况的"指示灯"中.
我个人并不倾向于在这种情况下失去太多的睡眠,因为一旦你测试它通常是显而易见的 - 我只记得一个它真的被我咬伤的情况,这是当我最终堆栈溢出时(在Windows Phone 7上运行的类型初始化程序中,不完全相同的情况,但同样是一个套管问题 - 基本上是混乱的调试环境.