HOW TO:決定是否提供選擇性參數
更新:2007 年 11 月
當程序定義選擇性參數時,可能需要判斷呼叫程式碼是已經提供對應的引數,還是省略引數。
若參數值等於其預設值,則原因可能是下列其中一項:
呼叫程式碼省略程序呼叫中的引數。
呼叫程式碼提供了引數,其值恰好等於參數的預設值。
程序程式碼無法判斷是其中哪一個原因。通常這不是問題,但在某些情況下,程序可能需要對每一個原因執行不同的動作。最好的方法是將可用性不大的值定義成預設值,雖然這不保證呼叫程式碼不能提供該值。
若一定要完全確定呼叫程式是否提供選擇性引數,則最安全的方法是定義程序的多載版本。請參閱 HOW TO:定義程序的多個版本和多載化程序的考慮因素。
若要判斷是否已將引數傳遞至選擇性參數
將不太可能使用的值定義成參數的預設值。
如果選擇性參數是 String 之類的參考型別,您就可以用 Nothing 做為預設值,只要不是引數需要的值即可。
在程序程式碼中,比較參數與預設值,並採取適當的動作。
多載包含和不含選擇性參數的程序
另一個用選擇性參數定義程序的方式是使用多載化 (Overloading)。如果您有一個選擇性參數,您可以定義程序的兩個多載化版本,其中一個接受該參數,而另一個則不接受。隨著選擇性參數數目的增加,這個方法會變得比較複雜。但是,它的優點是可以完全確定呼叫程式是否提供每一個選擇性引數。
若要定義不同的程序版本來加入或省略引數
以引數清單中的參數定義一個程序版本。不要將參數宣告為 Optional。
定義另一個不含參數的程序版本。宣告必須等於其他每個程序的第一個版本之宣告。
在相對的程序版本中,在每一個呼叫內放置適當的程式碼。
範例
下列程序定義選擇性參數 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
如果呼叫程式碼不在引數清單中提供 office 值,Visual Basic 將提供預設值 "QJZ"。
如果選擇性參數是 String 之類的參考型別,您就可以用 Nothing (Visual Basic) 做為預設值,只要不是引數的預期值即可。
如需範例,了解如何使用多載來判斷是否已傳遞選擇性參數,請參閱 HOW TO:使用選擇性參數的多載程序。