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

时间:2011-08-18 09:03:34

标签: c# visual-studio visual-studio-2010 syntax conventions

有可能在引用当前实例成员时强制在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#和其他语言之间切换时让我的生活变得更轻松,所以根本没有任何缺点。

5 个答案:

答案 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”,则它将无法编译。