2013-07-12 27 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

通常,您应该使用方法重载而不是可选参数。您可以获得所有相同的功能,而不会产生痛苦和性能缺陷。