【问题标题】:What is a good rule for when to prepend members with 'this' (C#)?什么时候在成员前面加上“this”(C#)的好规则是什么?
【发布时间】:2011-02-13 11:50:37
【问题描述】:

如果我正在访问成员字段、属性或方法,我永远不确定何时应该在其前面加上“this”。

我不是在询问需要它的情况,例如局部变量具有相同名称的情况。我说的是含义完全相同的情况。哪个更具可读性?有没有我应该遵循的标准、最佳实践或经验法则?它应该在整个类还是整个代码库中保持一致?

【问题讨论】:

标签: c# coding-style


【解决方案1】:

在这一点上我不同意 StyleCop,而且我什至不确定 StyleCop 的意见是否应该被解释为微软的官方指南。它是 Microsoft 使用的内部工具,但并非所有团队都使用它,也不是所有团队都使用所有规则。

没有必要在任何地方添加this,而且通常只会增加混乱。它不会提高性能,我不相信在代码中添加this 也会提高可读性。

您可能会听到这样的论点,即它可以更清楚地定义变量的定义位置,但我认为如果您的类/方法太长且太复杂以至于难以确定声明的位置,那么您可能应该重构无论如何。如果您使用single responsibility rule 并且有简短的函数,那么变量是成员、函数参数还是局部变量应该是显而易见的。

正如您所指出的,有时这是必要的。例如在构造函数中,如果你想设置一个与参数同名的私有成员。

public class Foo
{
    private Bar bar;

    public Foo(Bar bar)
    {
        this.bar = bar;
    }
}

【讨论】:

  • 如果您使用 FxCop 进行静态代码分析,您的函数永远不会太长,因为它会检查圈复杂度。
  • @Kevin Albrecht:圈复杂度与函数长度无关。这与代码中不同路径的数量有关。可以有高圈复杂度的短函数和低复杂度的长函数。
  • 我明白,但它们显然是相关的。
  • @Kevin Albrecht:当然经常存在相关性。我只是不同意检查圈复杂度保证“函数永远不会太长”。我当然见过不正确的例子。
  • +1 我完全同意这个答案。除非我必须像示例中那样使用它,否则我不会使用它。
【解决方案2】:

我建议使用 Microsoft 的指南,经 StyleCop 验证:http://blogs.msdn.com/sourceanalysis/

一般规则是,在成员前面加上“this”。当它们在类中定义时,除非它们是静态的,在这种情况下你不能。

这是直接来自 StyleCop 的规则:

SA1101: The call to {method or property name} must begin with the
'this.' prefix to indicate that the item is a member of the class.

【讨论】:

  • 几年前我养成了在我的 C# 代码中这样做的习惯,主要是为了利用智能感知,但它被卡住了。有趣的是,我不为 C++ 做这个(主要是使用 vim this-> 的代码,然后输入额外的 6 个字符;)。
【解决方案3】:

我会说尽可能避免,它可以为您节省一些(实际上很多)打字。

我将更多地依赖 Visual Studio 来帮助我找到属于的位置(永远不要忘记 F12)。我不使用记事本阅读我的 cs 文件:P

【讨论】:

    【解决方案4】:

    如果您遵循 Microsoft 的 StyleCop,则应始终使用带有 this 关键字的前缀类成员。

    SA1101:PrefixLocalCallsWithThis
    类型名称:PrefixLocalCallsWithThis
    CheckId:SA1101 类别:可读性规则

    这是同一主题的similar StackOverflow question

    【讨论】:

      【解决方案5】:

      我通常用这个来访问当前对象的参数。给定实例变量“m_”的命名约定,这使得在不知道其上下文的情况下,可以很容易地一目了然地看到以下语句的影响:

      m_Height += 10;    // an instance variable
      height += 10;      // a local variable
      this.Height += 10; // a property
      

      【讨论】:

      • 最好使用“this”。为所有成员。并使用小写的实例变量,以澄清哪些是不同的。实例变量:this.height。局部:高度。属性:this.Height。
      • 我同意凯文的观点,我不是“m_”约定的粉丝/
      • 每个人都有自己的。 m_height 比 this.height 短。我们的开发组决定让实例字段使用与局部变量不同的名称是一件好事。换句话说,在构造函数中,我们使用m_height = height 而不是this.height = height。 /耸肩
      【解决方案6】:

      在我的代码中,我只使用这个。 当属性是基类的成员时,而不是我当前所在的类。

      当然,完全不使用“this”是另一种流行的选择,因为它添加了不必要的代码。

      【讨论】:

      • 为什么不改用 base.Name 呢?
      • 我也可以这样做。这更像是一个提醒,该属性不是该特定代码文件的本地属性。
      【解决方案7】:

      我们在工作中的编码标准规定成员变量不应以“m”或“_”或大多数人使用的任何其他前缀。实际上,我发现自己一直在使用 this.memberVariable。我更喜欢清晰而不是额外的打字。正如其他答案中提到的,在引用与成员变量同名的参数时,这是必要的。

      【讨论】:

        【解决方案8】:

        如果您使用的是 Visual Studio 和 Intellisense。当您键入此内容时,您会得到一个仅包含您的类级别变量方法等的列表。忽略所有其他可能的项目。

        【讨论】:

          猜你喜欢
          • 2011-01-05
          • 1970-01-01
          • 2021-06-23
          • 1970-01-01
          • 2018-02-16
          • 1970-01-01
          • 2017-06-28
          • 2012-03-13
          • 2012-05-08
          相关资源
          最近更新 更多