拡張メソッドはまだ静的メソッドです。通常の静的メソッドを使用するのとまったく同じように使用できます。
唯一の違いは、拡張メソッドを使用すると、型の一部であるかのようにメソッドを使用できるため、次のように記述できることです。
int result = stringValue.BMethod();
それ以外の:
int result = BClass.BMethod(stringValue);
これは純粋にコンパイルの「トリック」として機能します。コンパイラは最初の形式を認識し、BClass使用可能な場合 (適切なものがありusing、参照されたアセンブリ内にある場合)、それを 2 番目のメソッドの IL に変換します。それは純粋に便利です。
どれが提案されていますか?
これは本当に依存します。型を制御する場合は、型自体にメソッドを配置することをお勧めします。通常、これは保守性が高くなります。
型を制御しない場合、または一般的な型 ( などIEnumerable<T>) を「拡張」しようとしている場合は、拡張メソッドが合理的なアプローチになる可能性があります。
ただし、型が非常に一般的な型である場合、通常は拡張メソッドを避けます。拡張メソッドはインテリセンスの「ノイズ」になり、さらに混乱を招く可能性があるためです。たとえば、個人的には、System.ObjectまたはSystem.Stringなどに拡張メソッドを追加することはお勧めしません。