我在VB.NET中编写了以下代码:
Dim obj As Object
obj = "00"
Test(obj)
MsgBox(obj)
Private Sub Test(ByRef num As Integer)
End Sub
Private Sub Test(ByVal num As Integer)
End Sub
当值“00”在方法“Test”中传递“ByRef”时,它将转换为0.但如果值“00”传递“ByVal”,则它保持与“00”相同的值。如何仅根据签名转换传递的值?
在VB6中虽然默认传递类型是“ByRef”,但仍然是相同的代码保持相同的值(“00”)
有没有人可以解释VB6和VB.NET中这种矛盾行为背后的原因?
答案 0 :(得分:7)
您正在这样做,ByRef将对象的类型从字符串更改为整数。默认情况下,当与字符串共存时,整数不具有trailling“0”。
下面这个例子可以帮助您了解什么是hapenning。
Sub Main()
Dim o1 As Object = "00"
Dim o2 As Object = "00"
Console.WriteLine(o1.GetType().ToString())
Test1(o1)
Console.WriteLine(o1.GetType().ToString())
Console.WriteLine(o2.GetType().ToString())
Test2(o2)
Console.WriteLine(o2.GetType().ToString())
Console.ReadLine()
End Sub
Sub Test1(ByVal num As Integer)
End Sub
Sub Test2(ByRef num As Integer)
End Sub
输出
System.String
System.String
System.String
System.Int32
我建议你总是转 Option Strict On ,这样可以消除很多困惑。
答案 1 :(得分:1)
该对象的类型为System.String。它不能将ByRef传递给方法,它的类型错误。所以编译器必须解决它并重写代码:
Dim obj As Object
obj = "00"
Dim $temp As Integer
$temp = CInt(obj)
Test($temp)
obj = $temp '' <=== Here
MsgBox(obj)
指示的语句是将对象从字符串更改为整数的语句。其中,通过MsgBox()调用再次转换为字符串,生成“0”而不是“00”。
值得注意的是C#不允许这样做并产生编译错误。这个重写技巧是相当讨厌的,如果方法本身改变了原始对象,那么你将很难猜测发生了什么,因为这不会改变传递的参数值。
答案 2 :(得分:0)
ByRef
表示值通过引用传递,并且在函数中将使用与已发送的值相同的值。
ByVal
表示值按值传递(函数创建传递值的副本),并且只使用值的副本。