tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 を使わないで済むのであれば、普段から
使わないようにしておいた方が無難かと思いますよ。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。