如何禁用隐式;这";在C#中?

如何禁用隐式;这";在C#中?,c#,visual-studio-2008,.net-3.5,this,C#,Visual Studio 2008,.net 3.5,This,这让我很困扰,我发现我在与Intellisense(VS 2008 Pro)结合使用时编写了愚蠢的bug: 你抓到了吗?我当然没有,直到我的行为从未改变,导致错误 Intellisense以某种方式将“isA”转换为“IsAction”,这意味着无论构造函数输入如何,属性Foo.IsAction始终为false。太棒了 我不得不说,我特别讨厌“隐式这个”(我不知道它是否有正式名称),我想把它关掉,这样它就永远不会假设它了。有办法做到这一点吗?这也适用于调用同一类的静态方法 或者,什么命名约定可以

这让我很困扰,我发现我在与Intellisense(VS 2008 Pro)结合使用时编写了愚蠢的bug:

你抓到了吗?我当然没有,直到我的行为从未改变,导致错误

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

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

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

问题不在于区分大小写的语言,而在于
this
的含蓄性。现在我想起来了,这也是VS2008职业赛的问题,而不是C。我可以在没有
this
的情况下使用已经编写的代码,但我不想在没有它的情况下编写新代码,这意味着在


诺多林的回答让我思考


现在我想起来了,这也是一个VS2008问题,而不是C。我可以在没有
这个
的情况下使用已经编写的代码(尽管如果我在那里胡闹,我会更改它),但我不想在没有它的情况下编写新代码,这意味着告诉Intellisense停止这样做。我能告诉Intellisense停下来吗?

你可以回到匈牙利记谱法[我准备在打字的时候被点燃]。如果你能对付丑陋,它就会解决你的问题。这是一个建议,不是建议

或者,我敢肯定静态代码分析会捕捉到这一点并警告您。试试FxCop

编辑

我已经使用Resharper一年多了,我知道以区分大小写的方式帮助您是非常明智的。在其他好处中,安装Resharper可以解决intellisense问题

编辑2


我刚查过。FxCop和Resharper都不会直接捕获此错误。这两种方法都捕获了一个事实,即isAction参数在Foo方法中未使用。在这种情况下,警告将提示您该错误。如果参数在方法中以另一种方式使用,它可能会在静态代码分析中漏掉。

这一直让我感到困惑。我已经开始使用一个“\ux”来预先设置要传递到构造函数中的变量,如:

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

恐怕没有办法禁用“隐式
”功能。它是语言规范和编译器的一部分,无法关闭它

个人而言,我不认为这是个大问题。诚然,注意成员名和参数名的大写很重要,但在区分大小写的语言(如C#)中,情况总是如此


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

这是Visual Studio intellisense中一个恼人的问题。但大多数情况下都是正确的。

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


如果名称仅因大小写不同而不同,那么我认为防止此类错误的唯一方法是意识到它们并小心,有效地使用单元测试。

这在其他功能中可能会很烦人,但您可以关闭Intellisense预选最近使用的成员的选项。我意识到这并不能彻底解决问题,但它可能有助于防止在您没有真正选择正确的项目时出现意外的制表符。

FxCop会抱怨这一点,因为从未使用isAction参数。具体来说,它将提取规则CA1801:ReviewUnusedParameters

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

注意:

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


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

这是一个常见问题。微软有一些,但对你的情况帮助不大

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

我个人的做法是使用字符“p”作为公共函数参数名的前缀。它不引人注目、简单、易于识别,并且易于使用诸如

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

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

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

    public bool IsAction { get; private set; }
}
我只是不知道
class Foo
{
    public Foo(bool pIsAction)
    {
        this.IsAction = pIsAction;
    }

    public bool IsAction { get; private set; }
}