拡張メソッドの登場は、既存のデータ型(特にライブラリや外部の型)に新しい機能を追加する必要性から生まれました。これにより、これらの型のソースコードを変更することなく、特に現代の.NETアプリケーションにおいて追加の利便性が必要となることが理解されます。
問題は、継承者やラッパーを作成せずに型を拡張できないことにあり、これが複雑なアーキテクチャや「偽の」継承を引き起こしました。
解決策は拡張メソッドです。Visual Basicでは、<Extension>属性でマークされた静的メソッドを持つモジュールとして宣言されます。メソッドの最初のパラメータは常に拡張される型を指し、これによりメソッドに対してオブジェクトの通常のメンバーとしてアクセスできるようになります。
コードの例:
Imports System.Runtime.CompilerServices Module StringExtensions <Extension> Public Function ToTitleCase(ByVal str As String) As String If String.IsNullOrEmpty(str) Then Return str Return Char.ToUpper(str(0)) & str.Substring(1).ToLower() End Function End Module ' 使用方法: Dim s As String = "visual basic" Console.WriteLine(s.ToTitleCase()) ' Visual basic
主な特徴:
拡張メソッドはクラス名を介して呼び出すことはできますか?
はい、拡張メソッドは拡張クラスの名前を介して静的メソッドとして呼び出すことができますが、最初の(this/Me)パラメータを明示的に指定する必要があります。
コードの例:
StringExtensions.ToTitleCase("test string")
Extension Methodsを介してシステムメソッドの動作をオーバーライドできますか?
いいえ、拡張メソッドは既存のインスタンスメソッドをオーバーライドしません。名前が一致する場合、型の本来のメソッドが呼び出されます。
拡張メソッドは可変数の引数(ParamArray)を持つことができますか?たとえば、文字列のために?
はい、通常の静的メソッドと同様に、拡張メソッドでParamArrayを使用することができます。
大規模プロジェクトで、各型に対して重複する名前や異なるロジックの拡張メソッドが作成され、統一されたスタイルがない状態です。
利点:
欠点:
モジュールには、標準的な型操作のためのユニバーサルで適切に文書化された拡張機能のみが集められます。各メソッドの名前は、目的を明確に示しています。
利点:
欠点: