Stylecop говорит мне добавить это ключевое слово, но оно избыточно - какие-либо последствия для производительности? - PullRequest
5 голосов
/ 16 января 2009

Я использую Stylecop для Resharper, и всякий раз, когда я вызываю что-то в своем классе, Stylecop говорит мне использовать ключевое слово this . Но в среде IDE говорится, что это избыточный код (и это наверняка), так почему я должен использовать ключевое слово this ?

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

Кроме того, в CLR такие вещи постоянно распространяются на разные языки? Так что, если ответ таков, что компилятор даже не касается ключевого слова this и предназначен только для наглядности и ясности, то то же самое верно и для VB.NET? Я предполагаю, что это все для ясности, так как stylecop следит за этим, а Fxcop (который я буду использовать позже) следит за качеством моего кода с технической точки зрения.

Спасибо

Ответы [ 6 ]

12 голосов
/ 16 января 2009

Это для ясности и предотвращения любой двусмысленности между членом класса и локальной переменной или параметром с тем же именем.

IL, к которому он компилируется, не будет отличаться.

3 голосов
/ 16 января 2009

Во всех случаях нет разницы в производительности с / без this - компилятор все еще делает это неявно, вводя ldarg.0 в IL.

Просто для полноты есть еще одно обязательное использование this (исключая устранение неоднозначности, ctor -цепь и передача this другим методам): методы расширения. Чтобы вызвать метод расширения в текущем экземпляре, вы должны квалифицироваться с this (хотя для обычного метода это будет неявным).

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

class Foo {
    void Test() {
        this.Bar(); // fine
        Bar(); // compiler error
    }
}
static class FooExt {
    public static void Bar(this Foo foo) { }
}
3 голосов
/ 16 января 2009

В большинстве случаев это просто для ясности, но иногда требуется.

using System;

class Foo
{
    String bar;

    public Foo(String bar)
    {
        this.bar = bar;
    }
}

Здесь вам потребуется this, поскольку он служит для устранения неоднозначности между полем bar и параметром конструктора bar. Очевидно, что изменение имени параметра или поля может привести к тому же результату.

0 голосов
/ 16 января 2009

Это просто для ясности, и можно спорить о том, что лучше. Python вообще не поддерживает опускание идентификатора self.

Кроме того, в CLR такие вещи постоянно распространяются на разные языки? Так что, если ответ таков, что компилятор даже не касается этого ключевого слова, и это только для наглядности и ясности, то то же самое верно и для VB.NET?

В JVM наверняка (а также для CLR, я почти уверен), код для ключевого слова "this" генерируется всегда, даже если он опущен в источнике - так будет, если всегда добавляется ключевое слово this , Поэтому я не думаю, что какой-либо компилятор .NET может генерировать различный вывод, поэтому не может быть снижения производительности.

Тогда это зависит от языка. Например, JScript (и даже JScript.NET) не позволяет опускать «this», как Python, потому что есть функции (поэтому «this.a ()» - это вызов метода, «a ()» - это вызов функции) и поскольку компилятор не знает членов каких-либо типов - они известны только во время выполнения (ну, на самом деле это не является невозможной проблемой, другая проблема более актуальна).

0 голосов
/ 16 января 2009

Помимо предоставленных примеров ясности, единственное другое допустимое использование ключевого слова this - передать текущий экземпляр объекта в качестве параметра.

0 голосов
/ 16 января 2009

В C # это ссылка на текущий экземпляр класса (это я в VB.NET). Обычно он используется для полной квалификации ученика. Например, рассмотрим этот класс C #:

public class MyClass
{
    int rate;

    private void testMethod()
    {
        int x;

        x = this.rate;
    }
}

это не требуется в приведенном выше коде, но добавляет мгновенную ясность при чтении кода, который относится к классу, а не к методу (поиск SO, вы найдете много мнений об использовании этого). Его семантическое поведение такое же, как в VB, и его использование не накладывает снижения производительности.

...