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

Col*_*ett 7 c# this .net-3.5 visual-studio-2008

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

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

    public bool IsAction { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

你懂了吗?我当然没有,直到IsAction从未改变,导致错误.

智能感知某种方式转换" isA<tab>"到"IsAction"对我来说,这意味着该属性Foo.IsAction始终不管构造输入错误.太棒了

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

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

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


Noldorin的回答让我思考.

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

Ric*_*dOD 6

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

警告3 CA1801:Microsoft.Usage:从不使用'Foo.Foo(bool)'的参数'isAction'.删除参数或在方法体中使用它.

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


LBu*_*kin 3

这是一个常见问题。Microsoft 对参数名称有一些建议,但它们对您的情况没有太大帮助。

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

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

您选择的特定命名约定取决于偏好和风格;然而,在您选择的实践中保持一致会有一些好处。

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

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

    public bool IsAction { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 参数名称是接口的一部分,对调用者可见。您可能会发现成员字段的约定会更好。 (3认同)