5

私は Resharper に Stylecop を使用しています。クラスで何かを呼び出すたびに、Stylecop はthisキーワードを使用するように指示します。しかし、IDE は、これは冗長なコードであると言っています (確かにそうです)。では、なぜthisキーワードを使用する必要があるのでしょうか?

冗長なコードは (明らかに) 必要ないことを意味し、コンパイラは this キーワードで何もしませんか? したがって、 this キーワードはわかりやすくするためのものだと思います。

また、CLR では、このようなことは言語間で一貫して当てはまりますか? したがって、答えが、コンパイラがthisキーワードに触れることさえなく、それがプレゼンテーションと明確さのためだけであるということである場合、同じことが VB.NET にも当てはまりますか? stylecop はこれを監視し、Fxcop (後で使用します) は技術的な観点からコードの品質を監視するため、すべて明確にするためだと思います。

ありがとう

4

6 に答える 6

12

これは、明確にするためであり、クラス メンバーと同じ名前のローカル変数またはパラメーターの間のあいまいさを防ぐためです。

コンパイル先の IL に違いはありません。

于 2009-01-16T02:42:18.307 に答える
3

ほとんどの場合はわかりやすくするためですが、必要な場合もあります。

using System;

class Foo
{
    String bar;

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

thisここでは、フィールドbarとコンストラクタ パラメータの間のあいまいさを解消するために必要になりますbar。明らかに、パラメーターまたはフィールドの名前を変更すると、同じことが実現できます。

于 2009-01-16T02:44:22.903 に答える
3

いずれの場合も、 の有無にかかわらずパフォーマンスの違いはありません。コンパイラは IL にthisa を挿入して暗黙的に実行します。ldarg.0

完全を期すために、もう 1 つの必須の使用方法がありますthis(明確化、ctor連鎖、および他のメソッドへの受け渡しを除くthis): 拡張メソッドです。現在のインスタンスで拡張メソッドを呼び出すには、修飾する必要thisがあります(通常のメソッドの場合は暗黙的ですが)。

もちろん、ほとんどの場合、クラスまたは基本クラスに通常のインスタンス メソッドを追加するだけです...

class Foo {
    void Test() {
        this.Bar(); // fine
        Bar(); // compiler error
    }
}
static class FooExt {
    public static void Bar(this Foo foo) { }
}
于 2009-01-16T08:10:44.023 に答える
0

C# では、これはクラスの現在のインスタンスへの参照です (VB.NET では私です)。通常、クラス メンバーを完全に修飾するために使用されます。たとえば、次の C# クラスについて考えてみます。

public class MyClass
{
    int rate;

    private void testMethod()
    {
        int x;

        x = this.rate;
    }
}

これは上記のコードでは必要ありませんが、レートがメソッドではなくクラスに属しているコードを読むと、すぐに明確になります (SO を検索すると、これの使用について多くの意見が見つかります)。そのセマンティックな動作は VB でも同じです。また、その使用によってパフォーマンスが低下することはありません。

于 2009-01-16T02:45:01.483 に答える
0

提供された明確な例とは別に、「this」キーワードの他の唯一の有効な使用法は、オブジェクトの現在のインスタンスをパラメータとして渡すことです。

于 2009-01-16T03:10:51.277 に答える
0

これは単に明確にするためのものであり、どちらが優れているかについて議論することができます。Python は、"self" 識別子の省略をまったくサポートしていません。

また、CLR では、このようなことは言語間で一貫して当てはまりますか? したがって、答えが、コンパイラが this キーワードに触れることさえなく、それがプレゼンテーションと明確さのためだけであるということである場合、同じことが VB.NET にも当てはまりますか?

確かにJVMでは(そしてCLRについても、私はほぼ確信しています)、ソースから省略されていても、「this」キーワードのコードは常に生成されます。したがって、どの .NET コンパイラでも異なる出力を生成できるとは思えないため、パフォーマンスが低下することはありません。

次に、言語によって異なります。たとえば、JScript (および JScript.NET でさえも) では、関数があるため、Python のように「this」を省略できません (つまり、「this.a()」はメソッド呼び出しであり、「a()」は関数呼び出しです)。 、およびコンパイラはどの型のメンバーも認識しないため、それらは実行時にのみ認識されます (実際、これは解決するのが不可能な問題ではなく、他の問題の方がより関連性があります)。

于 2009-01-16T03:55:39.860 に答える