C#StyleCop – 对于像当前类成员这样的基类成员使用“this。”前缀?
StyleCop有一个关于使用“this”的规则。 调用类成员的前缀(SA1101)。
这个规则是否适用于从其基类inheritance的类的成员(例如方法)。
例:
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 Rule SA1101的文档实际上提到了这一点:
只要代码包含对本地类的实例成员的调用或没有以“this”为前缀的基类 ,就会发生违反此规则的情况。
(重点是我自己添加)。 所以是的,规则需要this.
每次访问实例成员时,无论该成员是在本地类中还是从基类inheritance。
如果你考虑对象inheritance的规则,即使F1()
实际上是在BaseClass
声明的,它也会被ChildClass
inheritance,所以将它称为this.F1()
是有效的。 这就是StyleCop告诉你的事情。 通过this
调用前缀,您可以明确地调用类的当前运行时实例的F1()
实例方法。
实际上,将其称为F1()
或this.F1()
实际上是同义词,但使用this
前缀时,含义/意图会变得更清晰。
你根本不应该在这里使用base
前缀(即使它会编译)因为F1()
不是虚拟的并且在ChildClass
被覆盖。 使用base
前缀的唯一原因是,当您重写了虚拟基类成员并希望从重写成员中显式调用该基类成员时。 如果你确实使用了base
前缀而没有F1()
是虚拟的, 那么在你创建F1()
虚拟并在ChildClass
添加覆盖之前,一切都会有效。 此时,对base.F1()
任何调用都将继续调用BaseClass.F1()
而不是ChildClass
的新覆盖。
我认为这是正确的,因为规则适用于所有方法,无论它们是否在基础上定义。 就个人而言,我不是这个规则的忠实粉丝所以我只是禁用它。
我喜欢用base。 base.F1()适用于您的情况。 这可以防止意外地引用局部变量,并且可以直观地提醒成员来自何处。