タイトル : Re: Optional の使用方法 投稿日 : 2009/12/03(Thu) 09:34 投稿者 : 魔界の仮面弁士
> Optional の使用方法の質問です。 理由は幾つかありますが、Optional な引数を多用する事は避けた方が良いでしょう。 たとえば、省略可能な引数を用いた Sub Foo(ByVal a As Integer, Optional ByVal b As Integer = 123) '何かの処理 End Sub というメソッドを用意する代わりに、オーバーロードを用いて Sub Foo(ByVal a As Integer) Foo(a, 123) End Sub Sub Foo(ByVal a As Integer, ByVal b As Integer) '何かの処理 End Sub として実装しておいた方が、問題が出にくく、後々の拡張もやりやすくなるかと。 # といっても、既に Optional として実装してしまっている場合には、 # 今更それを変更すると、大がかりな修正になってしまうでしょうから、 # これは今後の話と思っておいてください。 > Optional を指定し、ディフォルト値も指定しているので、 たとえば、以下の物を変更した場合、別のメソッド定義とみなされます。 ・メソッドの名前 ・Sub/Functionの変更 ・戻り値の型 ・引数の個数 ・引数の型 ・ByVal/ByRef ・Optionalの付与/除去 ・ParamArrayの付与/除去 > コンパイルしなくてもDLLの差し替えだけでいけると思ったのですが、この考えは間違えでしょうか? CallByName を使うなど、レイトバインドで処理される場合にはその通りですが、 参照設定してアーリーバインドされたコードの場合は NG です。 メソッド定義が異なるため、「そんなメソッドは見当たりません」として MissingMethodException が発生してしまうことでしょう。 再コンパイルの手間を省きたいのであれば、以前のメソッド定義は残しておいてください。 その上で、引数の異なる同名メソッドをオーバーロードするなどの手法で 解決出来るかと思います(クラス継承やインターフェイス実装を行っている場合は制限あり)。 ただし、省略可能引数のみが異なるメソッドのオーバーロードは VB.NET では許可されていない点に注意してください。 また省略可能な引数は、C# ではサポートされない(4.0からのサポート)ため、 複数言語混在での開発時にも扱いにくいものとされています。 それゆえ、Optional を使わないで済むのであれば、普段から 使わないようにしておいた方が無難かと思いますよ。 |