您可以指定程序參數是選擇性的,而且呼叫程式時,不需要為其提供任何自變數。
選擇性參數 會以 Optional
程式定義中的 關鍵詞表示。 適用的規則如下:
程序定義中的每個選擇性參數都必須指定預設值。
選擇性參數的預設值必須是常數表達式。
在程式定義中遵循選擇性參數的每個參數也必須是選擇性的。
下列語法顯示具有選擇性參數的程式宣告:
Sub name(ByVal parameter1 As datatype1, Optional ByVal parameter2 As datatype2 = defaultvalue)
使用選擇性參數呼叫程序
當您使用選擇性參數呼叫程式時,可以選擇是否提供 自變數。 如果沒有,程式會使用針對該參數宣告的預設值。
當您省略自變數清單中的一或多個選擇性自變數時,您可以使用連續的逗號來標記其位置。 下列範例呼叫會提供第一個和第四個自變數,但不提供第二個或第三個自變數:
Sub name(argument 1, , , argument 4)
下列範例會對函式進行數次 MsgBox
呼叫。
MsgBox
有一個必要參數和兩個選擇性參數。
第一次呼叫 MsgBox
時,會按照 MsgBox
定義的順序提供這三個參數。 第二個呼叫僅提供必須的參數。 第三和第四個呼叫會提供第一個和第三個參數。 第三個呼叫會依位置執行此工作,而第四個呼叫會依名稱執行。
MsgBox("Important message", MsgBoxStyle.Critical, "MsgBox Example")
MsgBox("Just display this message.")
MsgBox("Test message", , "Title bar text")
MsgBox(Title:="Title bar text", Prompt:="Test message")
判斷選擇性參數是否存在
程式無法在運行時間偵測指定的自變數是否已省略,或呼叫端程式代碼已明確提供預設值。 如果您需要進行這項區別,您可以將不太可能的值設定為預設值。 下列程式會定義選擇性參數 office
,並測試其預設值 QJZ
,以查看是否已在呼叫中省略它:
Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ")
If office = "QJZ" Then
Debug.WriteLine("office not supplied -- using Headquarters")
office = "Headquarters"
End If
' Insert code to notify headquarters or specified office.
End Sub
如果選擇性參數是參考型別,例如 String
,您可以使用 Nothing
做為預設值,但前提是這不是自變數的預期值。
選擇性參數和多載
定義具有可選參數的函式的另一種方式是使用多載。 如果您有一個選擇性參數,您可以定義這個程序的兩個多載版本,一個接受此參數,一個不接受。 當選擇性參數數目增加時,此方法會變得更加複雜。 不過,其優點是您可以絕對確定呼叫程式是否提供每個選擇性自變數。