9

拡張メソッドと静的メソッドの違いは何ですか?

私はこのような2つのクラスを持っています:

public static class AClass {
    public static int AMethod(string ....)
    {
    }
}

public static class BClass {
    public static int BMethod(this string ....)
    {
    }
}

これらを次のように使用できます

AClass.AMethod('...');

また

'...'.BMethod();

どれが提案されていますか?

4

2 に答える 2

35

拡張メソッドはまだ静的メソッドです。通常の静的メソッドを使用するのとまったく同じように使用できます。

唯一の違いは、拡張メソッドを使用すると、型の一部であるかのようにメソッドを使用できるため、次のように記述できることです。

int result = stringValue.BMethod();

それ以外の:

int result = BClass.BMethod(stringValue);

これは純粋にコンパイルの「トリック」として機能します。コンパイラは最初の形式を認識し、BClass使用可能な場合 (適切なものがありusing、参照されたアセンブリ内にある場合)、それを 2 番目のメソッドの IL に変換します。それは純粋に便利です。

どれが提案されていますか?

これは本当に依存します。型を制御する場合は、型自体にメソッドを配置することをお勧めします。通常、これは保守性が高くなります。

型を制御しない場合、または一般的な型 ( などIEnumerable<T>) を「拡張」しようとしている場合は、拡張メソッドが合理的なアプローチになる可能性があります。

ただし、型が非常に一般的な型である場合、通常は拡張メソッドを避けます。拡張メソッドはインテリセンスの「ノイズ」になり、さらに混乱を招く可能性があるためです。たとえば、個人的には、System.ObjectまたはSystem.Stringなどに拡張メソッドを追加することはお勧めしません。

于 2013-10-02T16:42:05.057 に答える
2

拡張メソッドをオーバーライドすることはできません。メソッドのシグネチャが異なる場合にのみ、オーバーロードできます。

もちろん、いくつかの制限があります: 拡張メソッドは、静的メソッドとして、静的クラス (より正確には、ネストされていない、非ジェネリックな静的クラス内) で実装する必要があります。拡張メソッドを使用してクラスまたはインターフェイスを拡張できますが、オーバーライドすることはできません。インターフェイスまたはクラス メソッドと同じ名前とシグネチャを持つ拡張メソッドは呼び出されません。コンパイル時には、拡張メソッドは型自体で定義されたインスタンス メソッドよりも優先度が常に低くなります。拡張メソッドは、拡張している型のプライベート変数にアクセスできません。拡張メソッドは、実際に継承せずに既存のクラスに静的メソッドを追加する「合法的な」方法と見なすことができます。しかし面白いことに、クラスの通常の静的メソッドとは異なり、

また、拡張メソッド内では、メソッドが呼び出されている渡されたオブジェクト インスタンスのパブリック プロパティを自由に使用できます。静的オブジェクト データだけに限定されるわけではありません。拡張メソッドのみが静的メソッドですが、呼び出されるオブジェクトは完全な通常のオブジェクト インスタンスです。

于 2013-10-20T18:41:35.923 に答える