メソッドを呼び出すとき、base.methodnameとthis.methodnameを使用する必要がありますか?


8

C#では、継承されたクラスセットを使用して、メソッドを呼び出すときに、オーバーライドされたメソッドであるかどうかに関係なく、キーワード 'base.methodname and this.methodname' ...を使用する必要がありますか?

コードはロジックの点で変更される可能性が高く、おそらくIF-ELSEのような条件が後日発生する可能性があります。したがって、その時点で、開発者はコードの各行を再訪して、どのメソッドが呼び出されるかを正しく選択するように強いられます--- base.methodname()またはthis.methodname()ELSE。 NETフレームワークはDEFAULT(そのbase.methodname()だと思います)を呼び出し、ロジック全体がトスに進むことができます。


回答を質問に含めるのではなく、実際の回答として質問に追加してください。
yannis

3
「私の答えは:はい-それは良い習慣です-それがそれらが作成された理由だからです。」その論理により、「いいえ-良い習慣です。これらのキーワードの使用は理由によりオプションです。」
2012

回答:


27

baseキーワードの使用は好みの問題ではなく、正しさの問題です。オーバーライドされたメソッドで基本クラスの実装を呼び出す場合は、を使用する必要がありますbase。呼び出したくない場合は、を使用できませんbase

thisキーワードは、他の一方で、ほとんどの場合、好みの問題です。コードが不必要に散らかっているだけだと思う​​ので、必要がなければ使用しません。フィールド(またはプロパティ)と同じ名前のメソッドパラメータがある場合に便利です。そんな時に使っthisてみます。しかし、新しいコードを書いている場合、この問題を回避する命名規則を使用する傾向があります。


私が自分のためだけにコードを書いたり、自分や他の上級開発者によって保守されたりする場合はthis、想定どおり省略します。私が後輩(場合によっては新入社員)になる大規模なプロジェクトでは、コーダーの経験レベルに関係なくスコープがすぐにわかるように、これらのキーワードを使用するのが標準です。
Joel Etherton、2012

1
こんにちは、ジョエル...これに対するあなたの見方は私の見方と一致しています。私たちが取り組んでいるのは、2001年に書かれた古いC#コードであり、時々そこには迷路があります。また明日、数年後に開発者が誰になるか(研修生または経験者)はわかりません...したがって、これらのキーワードが使用され、誰かが(ポリモーフィズムのために)オーバーライドされたメソッドを実装すると、その開発者はロジックが失敗しないように、特定のメソッドの各呼び出しを再確認する必要があります。
MukeshAnAlsoRan

メソッドをオーバーライドしない場合、base意味的に間違っているのに、メソッドを呼び出すときに使用できないのはなぜですか?
Deduplicator

1
@JoelEthertonそのような「最低限の共通点」に応えるためのプログラミングは良い考えではないと思います。かなり複雑なものを議論する場合、その理論的根拠は理解できますがthis、基本的にはそれが可能な限り基本的なものです。プログラマーがメソッドのスコープ(およびthis.明示的に書かれていなくてもオブジェクトメンバーの暗黙的なアクセス)をまだ理解していない場合、プログラマーは理解する必要があります。それは彼らにあります
アレクサンダー-モニカを復活させる

1
@JoelEtherton私は一般的に同意します。たとえば、C ++テンプレートのメタプログラミングでは、夢中になったりはしません。しかしthis本当に基本的です。プログラミングスキルのはしごのすべてのラングの予想される知識です。
アレクサンダー-モニカを復活させる

5

そのメソッドがオーバーライドされているクラスから基本メソッドを明示的に呼び出している場合、ロジックと読みやすさの両方に深刻な問題があることをお勧めします。base実際には、オーバーライドされたメソッドからオーバーライドされたメソッドの基本実装を呼び出す場所にのみ表示されます。

他のすべての場所でthis(メソッドがオーバーライドされない場合は、とにかく基本クラスに移動します)必要があり、コンパイラがそれを推測できるようにすることには何の問題もありません。


0

thiskeyword:thisキーワードは個人的な好みであるため、適用するのに厳格な規則はありませんが、コードが乱雑になる可能性があります。

C#でこのキーワードを使用することの長所と短所

baseキーワード(再利用可能):ベースの使用を示す回答がすでにあります。ポイントを付けたいのですが。

すべての派生クラスの共通機能は基本クラスに含まれ、基本メソッドを呼び出してから、派生クラスのメソッドの特定の実装を呼び出して、再利用可能にすることができます。


0

上記に加えて、拡張機能を呼び出すときに「this」を使用できます。

public static class ExtensionForMyClass {  
public static void SomeFunction (this MyClass inst) {} 
}

あなたはできません:

SomeFunction();

MyClass本体の内側から。のみ:

this.SomeFunction();

作成しているクラスに静的拡張を作成する実際の理由はありません。私にとって便利だった1つのシナリオは、クラス自体ではなく、クラスが実装しているインターフェイスに基づく拡張関数がある場合です。


0

this.対称性を追加する場合を除いて、プレフィックスを削除することをお勧めします。例えば:

public class Foo: IComparable {
    int value1, value 2;

    public int CompareTo(object _that) {
        if (_that == null) return 1;
        if (Object.ReferenceEquals(this, _that)) return 0;

        Foo that = (foo) _that;
        var result = this.value1.CompareTo(that.value1)
        if (result != 0) return result;

        result = this.value2.CompareTo(that.value2)
        if (result != 0) return result;

        return 0
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.