【问题标题】:Can I force the use of 'this' keyword in c# .NET?我可以在 c# .NET 中强制使用“this”关键字吗?
【发布时间】:2011-08-18 09:03:33
【问题描述】:

在引用当前实例成员时,有没有办法在 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# 和其他语言之间切换时的生活更轻松,因此根本不会有任何缺点。

【问题讨论】:

  • 如果您使用 fxcop,Visual Studio 会在您犯第一个错误时发出警告
  • 正如你所说,我认为这不会对你遇到的问题产生任何影响,我建议将参数的名称改为bar,这样你就不会有什么问题。

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


【解决方案1】:

您只需启用“将警告视为错误”即可解决此问题:

警告 2 对同一变量的赋值;你的意思是指派别的东西吗?

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

编译器已经告诉你了;您应该查看警告(并以零警告为目标)。

中间的不清楚:

Foo = foo;

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

【讨论】:

  • 他的意思是,如果你的意思是this.Foo,你永远不能写Foo,你的意思是在第二个例子中。所以他的方式会抓住那个
  • 确实如此,但您写道,这仍然是一个不正确的错误
  • 是的,感觉现在更相关了
  • 谢谢!我目前正在重构一个大型项目,所以我有 100 多个“xxx 已过时”警告,所以我想我只是错过了它。我完全同意,发货时应该有零警告。
  • @Jonas - 如果有帮助,您可以启用“警告为错误”哦逐个错误的基础
【解决方案2】:

不,你不能像这样改变语言的行为。如果您使用 ReSharper,我 相信 您可以告诉它标记这类事情 - 它可能不会出现在错误列表中,但会出现在边缘和整个文件的“指示灯”中健康。

我个人不倾向于因为这类事情而失去太多睡眠,因为它通常在你测试后就很明显 - 我只能回忆一个场景它真的让我很痛苦,那是当我在 Windows Phone 7 上运行的类型初始化程序中最终遇到堆栈溢出(不完全相同的情况,但又是一个大小写问题) - 基本上混合了困难的调试环境。

【讨论】:

  • 我同意,我在单元测试时提出了这个想法,所以这真的没什么大不了的。我只是认为这将是一个“很高兴拥有”的功能。
【解决方案3】:

如果您不使用此前缀,您可以使用StyleCop 生成警告。您可以按照这些these instructions

让 StyleCop 作为构建过程的一部分运行

StyleCop 带有一堆默认规则,其中许多很糟糕,但您可以编辑您的规则文件以使您的开发人员最有意义。您还可以共享 StyleCop 文件,以便立即将更改复制给您的所有开发人员。

这是一个相当不错的解决方案,免费,由 Microsoft 提供,如果您想出合适的规则集,那么您的开发人员将创建更多“更整洁”的代码。您还可以按照定义长度的“方法不应太长”的行创建自定义规则。有很多东西可以玩。

我猜你也可以将警告设置为错误,但如果你确实确保你的 StyleCop 设置完全符合你的要求。

【讨论】:

  • 多么棒的工具!我用过 FxCop,但这是一个很好的补充。
【解决方案4】:

您可以使用 FXCop\Visual Studio 代码分析创建自定义警告和错误

【讨论】:

  • 存在编译器警告;不需要自定义规则
  • 我的意思是,您可以创建一个自定义警告,通知在没有“this”的情况下访问本地属性
  • 如果你想学究气,这就是你要走的路。 +1
【解决方案5】:

你可以使用StyleCopAnalyzers,规则SA1101

原因:

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

然后您可以在解决方案资源管理器中右键单击该规则并将其设置为错误,现在如果不使用“this”将无法编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2020-11-05
    • 2011-10-10
    相关资源
    最近更新 更多