C # StyleCop - Использование «это». префикс для членов базового класса, таких как текущий класс или нет? - PullRequest
8 голосов
/ 08 сентября 2010

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 ]

6 голосов
/ 08 сентября 2010

Документация для правила StyleCop SA1101 фактически упоминает это:

Нарушение этого правила происходит всякий раз, когда код содержит вызов члена экземпляра локального класса или базового класса , для которого нет префикса «this».

(ударение добавлено мной). Так что да, правило требует this. при каждом доступе к члену экземпляра, независимо от того, входит ли этот член в локальный класс или унаследован от базового класса.

5 голосов
/ 08 сентября 2010

Если вы думаете о правилах наследования объектов, даже если 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.

0 голосов
/ 08 сентября 2010

Я считаю, что это правильно, поскольку правило действует для всех методов независимо от того, определены они на основе или нет.Лично я не большой поклонник этого правила, поэтому я просто отключаю его.

0 голосов
/ 08 сентября 2010

Мне нравится использовать базу. base.F1 () для вашего случая. Это предотвращает случайную ссылку на локальную переменную и является визуальным напоминанием о том, откуда пришел член.

...