9

这让我很困扰,我发现当与 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。简直太棒了。

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

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

问题不在于区分大小写的语言,而是this. 现在我想起来了,这也更像是一个 VS 2008 Pro 问题而不是 C#。我可以忍受已经编写的代码,this但我不想在没有它的情况下编写新代码,这意味着告诉 In


诺多林的回答让我思考。

现在我想起来了,这也更像是 VS 2008 的问题,而不是 C#。我可以忍受已经编写的代码而没有this(尽管如果我在那里乱七八糟的话我会更改它)但是我不想在没有它的情况下编写新代码,这意味着告诉 Intellisense 停止这样做。 我可以告诉 Intellisense 将其关闭吗?

4

12 回答 12

6

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

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

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

于 2009-06-05T20:45:31.533 回答
4

你总是可以回到匈牙利符号[我正准备在我输入这个时被激怒]。如果你能处理丑陋,它会解决你的问题。这是一个建议,不是推荐。

或者,我非常确定静态代码分析会捕捉到这一点并警告你。试试 FxCop。

编辑

我已经使用 Resharper 一年多了,我知道以区分大小写的方式帮助您非常聪明。除其他好处外,您的智能感知问题将通过安装 Resharper 得到解决。

编辑 2

我刚检查过。FxCop 和 Resharper 都没有直接捕捉到这个错误。两者都抓住了 isAction 参数在 Foo 方法中未使用的事实。在这种情况下,警告会提示您错误。如果参数在方法中以其他方式使用,它可能会通过静态代码分析。

于 2009-06-05T19:46:03.340 回答
3

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

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

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

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

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

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

    public bool IsAction { get; private set; }
}
于 2009-06-05T20:13:35.093 回答
2

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

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

于 2009-06-05T20:03:43.477 回答
1

这一直让我着迷。我已经开始使用“_”将变量预先传递给构造函数,例如:

class Foo
{    
    public Foo(bool _isAction)
    {
        this.IsAction = _isAction;
    }
    public bool IsAction { get; private set; }}
于 2009-06-05T19:46:05.617 回答
1

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

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

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

于 2009-06-05T19:47:46.253 回答
0

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

于 2009-06-05T19:51:04.717 回答
0

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

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

于 2009-06-05T19:51:18.290 回答
0

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

于 2009-06-05T19:54:42.057 回答
0

笔记:

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

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

于 2009-06-05T20:11:41.103 回答
0

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

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

VS2019 中的代码样式选项

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

VS2019 中的代码样式错误

另请参阅有关 EditorConfig 文件格式的文档,其中相关参数的名称如下dotnet_style_qualification_for_field

于 2020-08-15T12:32:36.303 回答
0

进一步的想法是:

  1. 实现您自己的检查器,例如通过搜索 regex \b(\w+)\b\s*=\s*\1。这将找到所有自赋值,而不仅仅是在类构造函数中。它在理论上不是万无一失的(例如,它不会捕获带有/**/评论的自我分配),但它应该在所有实际场景中都足够好。

  2. 如果您不介意一些额外的输入,您最初可以给构造函数参数一个不同的名称,并在编写构造函数的主体后重命名它。

于 2020-08-15T19:07:24.543 回答