小弟最近发现一个奇怪的现象,求教各位:下面的三个函数(过程)定义如下:
private sub StrAdd_1(str as string)
private function StrAdd_2(str as string)
private function StrAdd_3(str as string)as String当我分别调用三个函数时,发现以下现象:
StrAdd_1不会改变传入的字符串的值;
StrAdd_2也不会改变传入的字符串的值;
StrAdd_3改变传入的字符串的值。也就是说:
sub 和 无返回值的 function 没有对字符串当作传引用或者指针拷贝方式调用,即完整的复制了一份字符串数据给形参。(非常耗时)
而只有第三种有返回值的 function 将使用传引用或传指针方式调用。(在C++里,传指针也是传值方式啊)简直让我莫名其妙!!!
按道理是否对string类型参数不管 byval 还是 byRef 应该都能够改变实际参数的值啊!?
谁也经历过这个问题?谢谢指教!上述环境 Excel XP VBA
private sub StrAdd_1(str as string)
private function StrAdd_2(str as string)
private function StrAdd_3(str as string)as String当我分别调用三个函数时,发现以下现象:
StrAdd_1不会改变传入的字符串的值;
StrAdd_2也不会改变传入的字符串的值;
StrAdd_3改变传入的字符串的值。也就是说:
sub 和 无返回值的 function 没有对字符串当作传引用或者指针拷贝方式调用,即完整的复制了一份字符串数据给形参。(非常耗时)
而只有第三种有返回值的 function 将使用传引用或传指针方式调用。(在C++里,传指针也是传值方式啊)简直让我莫名其妙!!!
按道理是否对string类型参数不管 byval 还是 byRef 应该都能够改变实际参数的值啊!?
谁也经历过这个问题?谢谢指教!上述环境 Excel XP VBA
VB就没有你说的问题.
Dim str1$, str2$, str3$, strTmp$
str1$ = "old"
str2$ = "old"
str3$ = "old"
StrAdd_1 (str1$)
StrAdd_2 (str2$)
strTmp$ = StrAdd_3(str3$)
MsgBox str1$
MsgBox str2$
MsgBox str3$
End Sub
Private Sub StrAdd_1(str As String)
str = "New"
End Sub
Private Function StrAdd_2(str As String)
str = "New"
End Function
Private Function StrAdd_3(str As String) As String
str = "New"
End Function
=====================================================
但是我试过了如果全部使用 CALL 关键字的话,就全部是打印出“New”来。比如 Call StrAdd_1 (str1$)
现在的问题是,写Call和不写Call有什么区别??
Msdn上面也没说啊。搞的我糊涂了一个下午那天,浪费时间。
请各位指教。
如:StrAdd_1 str1$
StrAdd_2 str2$
这一句:strTmp$ = StrAdd_3(str3$) 是调用了函数过程。
照你的说法,StrAdd_1(str1$)就没有调用函数了吗?不对吧。zhujiechang(小朱):
你回复正是次现象的说明,可是为什么差别这么大?
为什么要设计这么个容易引起Bug的差别(我还得回去检查我的其它代码),好处在哪里?值得吗?
额外的拷贝多浪费木材啊,^_^
不加call的时候,正如zhujiechang(小朱)所说。。
而strTmp$ = StrAdd_3(str3$) 是调用了函数过程后,返回str = "New"的值