VB.NET中的ByRef

时间:2013-05-27 18:07:20

标签: vb.net

我在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中这种矛盾行为背后的原因?

3 个答案:

答案 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表示值按值传递(函数创建传递值的副本),并且只使用值的副本。