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

Ami*_*imi 8 c# coding-style stylecop this

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?
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*mwi 6

StyleCop Rule SA1101文档实际上提到了这一点:

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

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


Sco*_*man 5

如果你考虑对象继承的规则,即使F1()它实际上是在BaseClass它上面声明的继承,ChildClass所以将其称为是有效的this.F1().这就是StyleCop告诉你的事情.通过为调用添加前缀this,您将调用类的当前运行时实例的F1() 实例方法变得明确无误.

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

你不应该在base这里使用前缀(即使它会编译),因为F1()它不是虚拟的并且被覆盖ChildClass.使用base前缀的唯一原因是,当您重写了虚拟基类成员并希望从覆盖成员中显式调用该基类成员时.如果你确实使用了base前缀而F1()不是虚拟的,那么在你创建F1()虚拟并添加覆盖之前,一切都会有效ChildClass.此时,任何调用base.F1()将继续调用BaseClass.F1()而不是新的覆盖ChildClass.