有可能在引用当前实例成员时强制在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#和其他语言之间切换时让我的生活变得更轻松,所以根本没有任何缺点。
答案 0 :(得分:11)
您可以通过启用“将警告视为错误”来解决此问题:
警告2对同一变量作出的分配;你的意思是分配其他东西吗?
(CS1717,如果您只想为此启用它)
编译器已经告诉你这个;你应该检查警告(并针对零警告)。
中间人不清楚:
Foo = foo;
我不同意 - 这对我来说非常清楚(除非你来自VB背景并且已经发展了案例盲)。
答案 1 :(得分:5)
不,你不能像这样改变语言的行为。如果你使用ReSharper我相信你可以告诉它标记这种事情 - 它可能不会出现在错误列表中,但是在边缘和整个文件的“指示灯”中健康。
我个人不会倾向在这类事情上失去太多的睡眠,因为一旦你测试它通常通常 - 我只记得一个场景它真的让我感到困惑,当我在Windows Phone 7上运行的类型初始化程序中最终出现堆栈溢出(不完全相同的情况,但同样是一个外壳问题)时,基本上是混合了困难的调试环境。 / p>
答案 2 :(得分:3)
如果您没有使用此前缀,则可以使用StyleCop生成警告。您可以通过遵循这些these instructions
让StyleCop作为构建过程的一部分运行StyleCop附带了许多默认规则,其中许多都很糟糕,但您可以编辑规则文件以使开发人员最有意义。您还可以共享StyleCop文件,以便立即将更改复制到所有开发人员。
它是一个相当不错的解决方案,免费,由Microsoft提供,如果你想出一个合适的规则集,那么你的开发人员将创建更多“更整洁”的代码。您还可以在“方法不应太长”的行中创建自定义规则,您可以在其中定义长度。很多东西都可以玩。
此外,我猜您可以将警告设置为错误,但如果您确实确保您的StyleCop设置完全符合您的要求。
答案 3 :(得分:2)
您可以使用FXCop \ Visual Studio代码分析
创建自定义警告和错误答案 4 :(得分:2)
您可以使用StyleCopAnalyzers
,规则SA1101:
原因:
在C#代码文件中,对本地类或基类的实例成员的调用没有前缀“ this。”。
然后,您可以在解决方案资源管理器中右键单击该规则并将其设置为错误,如果不使用“ this”,则它将无法编译。