C#StyleCop - 使用“this”。基类成员的前缀,如当前的类成员与否?

时间:2010-09-07 22:24:42

标签: c# coding-style this stylecop

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?
    }
}

我知道这只是为了更好的可读性。

4 个答案:

答案 0 :(得分:6)

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

  

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

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

答案 1 :(得分:5)

如果您考虑对象继承的规则,即使在F1()上实际声明了BaseClass,它也会由ChildClass继承,因此将其称为{{1}是有效的}。这就是StyleCop告诉你的事情。通过使用this.F1()为调用添加前缀,您可以明确地调用类的当前运行时实例的this 实例方法。

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

你根本不应该在这里使用this前缀(即使它会编译)因为base不是虚拟的并且在F1()中被覆盖。使用ChildClass前缀的唯一原因是,当您重写了虚拟基类成员并希望从覆盖成员中显式调用该基类成员时。如果您确实使用了base前缀而base不是虚拟的,那么 实际上会有效,直到您F1()虚拟并在F1()中添加了覆盖为止。此时,对ChildClass的任何来电都会继续拨打base.F1()而不是BaseClass.F1()中的新覆盖。

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

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