如何在C#中禁用隐含的“this”?

时间:2009-06-05 19:41:29

标签: c# visual-studio-2008 .net-3.5 this

这给我带来了很多麻烦,我发现当我与Intellisense(VS 2008 Pro)结合使用时,我会写出愚蠢的错误:

class Foo
{
    public Foo(bool isAction)
    {
        this.IsAction = IsAction;
    }

    public bool IsAction { get; private set; }
}
你抓到了吗?我当然没有,直到IsAction从未改变,导致错误。

Intellisense以某种方式将“isA<tab>”转换为“IsAction”,这意味着无论构造函数输入如何,属性Foo.IsAction 总是为false。真是太棒了。

我不得不说我特别讨厌“隐含的this”(我不知道它是否有正式的名称)我想把它关掉所以它永远不会假设它。 有没有办法做到这一点?这也适用于调用同一类的静态方法。

或者,哪些命名约定可以避免这个小问题?该属性必须保留为“IsAction”,因此它必须是构造函数参数名称的约定。奇怪的是,如果我用完全匹配的拼写命名它,那么this.IsAction = IsAction;就可以正常工作。

问题不是区分大小写的语言,而是this的隐含性。现在我考虑一下,这也是一个VS 2008 Pro问题而不是C#。我可以使用已经没有this编写的代码,但我不想写没有它的新代码,这意味着告诉In


Noldorin的回答让我思考。

现在我考虑一下,这也是一个VS 2008问题而不是C#。我可以使用已经没有this编写的代码(虽然如果我在那里,我会改变它)但我不想写没有它的新代码,这意味着告诉Intellisense停止这样做。 我可以告诉Intellisense将其敲掉吗?

12 个答案:

答案 0 :(得分:6)

我刚刚在Visual Studio 2008中尝试过您的代码。启用内置的静态分析会产生以下错误:

  

警告3 CA1801:Microsoft.Usage:   参数'isAction'的   永远不会使用'Foo.Foo(bool)'。去掉   参数或在方法中使用它   体。

我的建议是通过启用此功能,您会在早期发现这样的错误。要启用此选项,请从项目的上下文菜单中选择属性,然后选择“代码分析”选项卡并选择“在构建时启用代码分析”

答案 1 :(得分:4)

你总是可以回到匈牙利语中[我正准备在我打字的时候受到抨击]。如果你可以处理丑陋,它将解决你的问题。这是一个建议,而不是推荐。

或者,我很高兴看到静态代码分析会抓住这个并警告你。试试FxCop。

修改

我已经使用Resharper超过一年了,而且我确实知道以一种区分大小写的方式协助你是非常聪明的。除了其他好处之外,您的intellisense问题将通过安装Resharper来解决。

编辑2

我刚刚检查过。 FxCop和Resharper都没有直接捕获此错误。两者都捕获的是isAction参数在Foo方法中未使用的事实。在这种情况下,警告会让你知道错误。如果在方法中以另一种方式使用参数,则可能会通过静态代码分析。

答案 2 :(得分:3)

这是一个常见问题。微软有一些recommendations for parameter names,但它们对你的情况并不十分有用。

正如其他响应者所提到的,您不能“禁用”C#语言范围解析行为 - 您最好的方法是命名约定。其他人提到了“匈牙利”符号 - 由于符号的confusion over the original intent,有些人对此有一种下意识的反应。

我的个人方法是使用字符“p”作为公共函数参数名称的前缀。它不显眼,简单,易于识别,并且易于使用Resharper等工具强制执行。

您选择的特定命名约定是偏好和风格的问题;但是,在您选择的实践中保持一致会带来一些好处。

使用我建议的命名约定,您可以将构造函数编写为:

class Foo
{
    public Foo(bool pIsAction)
    {
        this.IsAction = pIsAction;
    }

    public bool IsAction { get; private set; }
}

答案 3 :(得分:2)

FxCop会抱怨这个,因为从不使用isAction参数。具体来说,它将拉出规则CA1801:ReviewUnusedParameters。

就我个人而言,我一直认为C#编译器应该对未使用的参数发出警告。

答案 4 :(得分:1)

这让我一直都在。我已经开始使用'_'将传递给构造函数的变量添加到前面,例如:

class Foo
{    
    public Foo(bool _isAction)
    {
        this.IsAction = _isAction;
    }
    public bool IsAction { get; private set; }}

答案 5 :(得分:1)

我担心无法禁用“隐式this”功能。它是语言规范和编译器的一部分,并且无法将其关闭。

就个人而言,我不认为这是一个大问题。不可否认,要小心成员和参数名称的大写是很重要的,但这种情况始终是用C#等区分大小写的语言。

我推荐的“解决方案”(您似乎已经在做)是始终使用this关键字来引用属性/字段,以便在您应该使用参数时它立即突出。它不会为你解决问题,但如果你牢记它,它无疑会有所帮助。养成这个习惯(以及记住所有参数/局部变量名称应该从小写开始)将会很好地避免将来出现这个问题。

答案 6 :(得分:0)

这是Visual Studio智能感知中的烦人问题。 Resharper大部分时间都是正确的。

答案 7 :(得分:0)

我认为开发人员更有可能从Intellisense选择“IsAction”而不是“isAction”。我不认为Intellisense会将“isA”改为“this.IsAction”。

如果名称只是个案不同,那么我认为防止这类错误的唯一方法就是通过了解它们并小心谨慎,并有效地使用单元测试。

答案 8 :(得分:0)

在其他功能中可能会很烦人,但您可以关闭Intellisense选择最近使用的成员的选项。我意识到这不会真正解决问题,但如果你没有选择正确的项目,它可能有助于防止一些意外的标签。

答案 9 :(得分:0)

注意:

如果您使用的是Resharper,您可以使用一些快捷方式为您编写大量此代码并避免错误。

您可以先创建属性,然后点击Alt-Ins并选择“生成构造函数”,或者您可以在构造函数中添加参数“isAction”,在参数名称中使用插入符号按Alt-Enter,然后选择弹出的菜单中的“创建并初始化自动属性IsAction”操作。

答案 10 :(得分:0)

自2009年提交其他答案以来,情况发生了变化。我看到这个问题被标记为 visual-studio-2008 ,但这可能仍然可以帮助某个人。在Visual Studio的最新版本(例如Visual Studio 2019)中,可以将IDE配置为检查C#代码的代码样式一致性。可用的检查之一是要求明确使用 this

转到选项>文本编辑器> C#>代码样式>常规,您将在其中找到名为'this'的组。偏好。将每个设置为首选“此”。,并将严重性设置为错误

Code style options in VS2019

任何违反C#代码的行为都会导致IDE中显示代码样式检查错误。奇怪的是,这不会导致构建失败。

Code style errors in VS2019

另请参见documentation on the EditorConfig file format,其中相关参数的命名类似于dotnet_style_qualification_for_field

答案 11 :(得分:0)

其他想法是:

  1. 实施您自己的检查器,例如通过搜索正则表达式select sum(eom_mbr_count / 3.0) / from elig 。这将发现所有的自赋值,而不仅是在类构造函数中。从理论上讲,它不是万无一失的(例如,它不会捕获带有\b(\w+)\b\s*=\s*\1注释的自我分配),但在所有实际情况下都应该足够好。

  2. 如果您不介意进行一些额外的键入操作,则可以首先为构造函数参数指定一个不同的名称,并在编写构造函数的主体后重命名它。