ProgrammingVB.NET 開発者

Visual Basicでは、Optionalパラメータをどのように宣言して使用し、デフォルト値を設定する際にどのような落とし穴があるか?

Hintsage AIアシスタントで面接を突破

回答

Visual Basic(Classicおよび.NET)では、手続きや関数にOptionalキーワードを使用して必須でないパラメータを宣言できます。また、そのようなパラメータにデフォルト値を設定することも可能です。

構文:

Sub SendMessage(message As String, Optional urgent As Boolean = False) If urgent Then Console.WriteLine("URGENT: " & message) Else Console.WriteLine(message) End If End Sub ' 呼び出し: SendMessage("こんにちは!") ' urgent = False SendMessage("重要なメッセージ!", True)

重要な注意点:

  • Optionalパラメータは常にパラメータリストの最後に配置する必要があります。
  • パラメータにデフォルト値がない場合、それはNothingまたは型のデフォルト(例えば、Integerの場合は0)として定義されます。
  • Classic VBでは、Optionalの型の選択肢が制限されています。デフォルト値のない型(例:nullを含むクラス)を使用することはできません。

問題のある質問

質問: Visual Basicでは、Optionalの後に必須パラメータを宣言できますか?理由を説明してください(いいえ/はい)どうすれば回避できますか?

回答: いいえ、少なくとも1つのパラメータをOptionalとして宣言した後は、すべての次のパラメータもOptionalとして宣言する必要があります。これは、位置に応じたパラメータの渡し方の混乱を避けるための構文要件です。

不正なコードの例:

Sub PrintReport(Optional pageSize As String = "A4", copies As Integer) ' コンパイルエラー: 必須パラメータはOptionalの後に置くことはできません End Sub

解決策としては、パラメータの順序を変更します:

Sub PrintReport(copies As Integer, Optional pageSize As String = "A4") ' 正しいバージョン End Sub

このテーマに関する実際のエラー例


物語

大規模プロジェクトで、クライアントがファイル共有手続きにOptionalパラメータを追加し、デフォルト値の必要性を忘れてしまいました。その結果、パラメータを指定せずにメソッドを呼び出すと、Nothingがファイル名として処理され、ロードエラーが発生しました。


物語

別のシステムからメソッドシグネチャをコピーした結果、パラメータの順序が混乱し、必須パラメータがOptionalの後に来てしまいました。プログラマーはエラーを修正しましたが、すべての呼び出しで番号がずれていることに気づかず、コードの30か所以上で関数が正しく動作しませんでした。


物語

コード量を減らすために、文字列パラメータのデフォルト値として空の文字列を設定することが決定されました。しかし、いくつかのケースでは空の値の処理が省略されたパラメータの処理と異なり、対話ロジックに矛盾を引き起こし、標準のテキストを表示する代わりに説明なしにフォームを隠すことになりました。