-1

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

4

3 回答 3

7

你这样做的方式是,ByRef 将对象的类型从字符串更改为整数。默认情况下,整数在转换为字符串时没有尾随“0”。

下面的示例可能会帮助您了解正在发生的事情。

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,这将消除很多混乱。

于 2013-05-27T18:21:23.723 回答
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# 不允许这样做并产生编译错误。这种重写技巧相当讨厌,如果方法本身更改了原始对象,那么您将很难猜测发生了什么,因为这不会更改传递的参数值。

于 2013-05-27T19:56:03.583 回答
0

ByRef表示值通过引用传递,并且在函数中将使用已发送的相同值。

ByVal表示值按值传递(函数创建传递值的副本)并且您仅使用值的副本。

于 2013-05-27T18:30:18.027 回答