【问题标题】:C# StyleCop - Using "this." prefix for base class members like current class members or not?C# StyleCop - 使用“this”。基类成员的前缀是否像当前类成员?
【发布时间】:2010-09-07 22:24:42
【问题描述】:

StyleCop 有一条关于使用“this”的规则。调用类成员的前缀 (SA1101)。

这条规则是否适用于从其基类继承的类的成员(例如方法)。

例子:

class BaseClass
{
    protected void F1()
    {
        ...
    }
}    

class ChildClass : BaseClass
{
    protected void F2()
    {
        ...
    }

    protected void F3()
    {
        this.F2(); // This is correct acording to SA1101

        // F1 is a member of base class and if I dont put this prefix, stylecop will not show any message.
        this.F1(); // Is this correct?
        F1();      // Or this?
    }
}

我知道这只是为了提高可读性。

【问题讨论】:

  • 好吧,那么在我的优先级列表中尝试 StyleCop 就完蛋了。
  • @Jon Hanna:您可以配置实际运行的规则。在您查看并确定哪些规则对您重要/有用之前,我不会打折 StyleCop。
  • @A. Karimi 不是为了可读性,实际上使用 base 会使代码更具可读性,它是为了避免错误。该文档有很好的示例和解释stylecop.soyuz5.com/SA1100.html

标签: c# coding-style this stylecop


【解决方案1】:

documentation for StyleCop Rule SA1101实际上提到了这一点:

只要代码包含对本地类或基类的实例成员的调用,且该实例成员没有以“this”为前缀,就会违反此规则。

(我自己添加的重点)。所以是的,该规则在每次访问实例成员时都需要this.,无论该成员是在本地类中还是从基类继承。

【讨论】:

  • 谢谢,有兴趣!当您忘记“this”时,StyleCop 不会显示任何消息。基本成员的前缀。
【解决方案2】:

如果您考虑对象继承的规则,即使F1() 实际上是在BaseClass 上声明的,它也被ChildClass 继承,因此将其称为this.F1() 是有效的。这就是 StyleCop 告诉你的。通过在调用前加上 this 前缀,就可以清楚地看出您正在调用类的当前运行时实例的 F1() instance 方法。

事实上,将其称为F1()this.F1() 实际上是同义词,但使用this 前缀时含义/意图变得更加清晰。

您根本不应该在此处使用base 前缀(即使它会编译),因为F1() 不是虚拟的并且在ChildClass 中被覆盖。使用base 前缀的唯一原因是当您覆盖了一个虚拟基类成员并希望从覆盖成员中显式调用该基类成员时。如果您确实使用了base 前缀而没有F1() 是虚拟的,那么在您将F1() 设为虚拟并在ChildClass 中添加覆盖之前,所有 实际工作。此时,任何对base.F1() 的调用都将继续调用BaseClass.F1(),而不是ChildClass 中的新覆盖。

【讨论】:

    【解决方案3】:

    我认为这是正确的,因为该规则适用于所有方法,无论它们是否在基础上定义。就我个人而言,我不是这条规则的忠实拥护者,所以我只是禁用它。

    【讨论】:

    • 我同意你的观点,但有没有人或类似 stylecop 的东西可以解释这一点?
    【解决方案4】:

    我喜欢使用基地。 base.F1() 适合您的情况。这可以防止意外引用局部变量,并直观地提醒成员来自何处。

    【讨论】:

    • 这很好,但在这种情况下,我们将在 stylecop 中遇到另一条规则(SA1100:如果项目在基类中声明为虚拟并覆盖,则对 GetItem 的调用应仅使用“base.”前缀)在本地类中定义。否则,在调用前加上 this 而不是 base)
    • 使用“base”如果不是你正在调用的当前虚拟方法的基本方法,那将是非常糟糕的做法。基本方法可以设置为虚拟的,而您(或您上方层次结构中的其他人)可能想要覆盖它,然后您的基本调用将调用错误的方法。
    • 那是非常糟糕的做法。您应该仅使用 base 来指定您希望在该类中定义的基本方法而不是。在超越或隐藏之外的任何地方调用它充其量是狡猾的。它很容易出错,并且会使查看代码的其他人感到困惑,因为他们会将其解释为被合理使用,并且会困惑为什么他们找不到覆盖或隐藏方法。
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 2021-12-08
    • 2019-04-17
    • 2011-12-20
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多