2013-07-12 30 views
1

我調試的一個項目,現在和它具有以下簽名的函數:可選BYVAL布爾參數不採取它的默認值

Public Function changeRemoteDirectory(ByVal newDirectory As String, Optional ByVal Direction As Boolean = True) As Boolean 

    MsgBox(direction) 

    'rest of code 

End Function 

我試圖找出是什麼導致這個函數返回當我知道它應該返回TrueFalse值因爲我提供輸入,所以我把MsgBox(direction)Function看什麼的direction的價值是,當我打電話給Function。我叫這樣的功能,但我收到了MsgBox這顯示了direction值是False

changeRemoteDirectory("/internal") 

第一個參數工作得很好,並需要它正確地執行工作的代碼,但我想不通在爲什麼Direction的值爲False的情況下,我相信它的默認值應該是True。如果需要,我並不完全反對重寫Function,但是在這裏任何人都可以辨別爲什麼Direction沒有True的值,當調用函數changeRemoteDirectory()時沒有提供第二個參數?

+1

改爲使用重載。您可以獲得與調試和性能問題相同的功能。 – jbabey

+0

@jbabey - 謝謝。如果我最終不得不重寫這個函數,那正是我想要做的。無論如何,我仍然好奇爲什麼會發生這種情況,因爲我從未遇到過這個問題。 –

+3

聽起來好像您正在經歷可選參數導致的許多痛苦之一。當調用'changeRemoteDirectory'的代碼被編譯時,可選參數被注入到調用中,就像'const'在編譯時被替換一樣。沒有重新編譯**調用者**,對可選參數值的更改不會更新。請參閱[本文](http://jelle.druyts.net/2003/05/17/OptionalParametersVBNET.aspx)瞭解更多信息。 – jbabey

回答

2

聽起來好像您正在經歷可選參數導致的許多痛苦之一。

當調用changeRemoteDirectory的代碼被編譯時,可選參數被注入到調用中,就像const將在編譯時被替換一樣。沒有重新編譯調用者,對可選參數值的更改將不會生效。

有關更多信息,請參見this article

通常,您應該使用方法重載而不是可選參數。您可以獲得所有相同的功能,而不會產生痛苦和性能缺陷。