应该根据需求和知识来使用Byval和byref参数,它们如何不按速度工作。
原文链接:https://www.f2er.com/vb/256353.htmlhttp://www.developer.com/net/vb/article.php/3669066
编辑
回应斯劳的评论 –
在运行时消耗更多的资源?
参数在堆栈上传递。栈是非常快的,因为它的内存分配只是一个指针增量来保留一个新的“帧”或“分配记录”。大多数.NET参数不超过机器寄存器的大小,所以很少使用任何“堆栈”空间来传递参数。事实上,基本类型和指针都在堆栈上分配。 .NET中的堆栈大小限制为1MB。这应该让你了解参数传递消耗的资源有多少。
你可能会发现这一系列的文章很有趣:
哪个更快? ByVal或ByRef。
很难测量准确和仙女 – 取决于你的测量的上下文,但一个基准,我写了一个方法1亿次出现了以下:
>参考类型 – Passed ByRef:420ms
>参考类型 – Passed ByVal:382ms
>值类型 – 传递ByRef:421ms
>值类型 – 传递ByVal:416ms
Public Sub Method1(ByRef s As String) Dim c As String = s End Sub Public Sub Method2(ByVal s As String) Dim c As String = s End Sub Public Sub Method3(ByRef i As Integer) Dim x As Integer = i End Sub Public Sub Method4(ByVal i As Integer) Dim x As Integer = i End Sub Sub Main() Dim s As String = "Hello World!" Dim k As Integer = 5 Dim t As New Stopwatch t.Reset() t.Start() For i As Integer = 0 To 100000000 Method1(s) Next t.Stop() Console.WriteLine("Reference Type - ByRef " & t.ElapsedMilliseconds) t.Reset() t.Start() For i As Integer = 0 To 100000000 Method2(s) Next t.Stop() Console.WriteLine("Reference Type - ByVal " & t.ElapsedMilliseconds) t.Reset() t.Start() For i As Integer = 0 To 100000000 Method3(i) Next t.Stop() Console.WriteLine("Value Type - ByRef " & t.ElapsedMilliseconds) t.Reset() t.Start() For i As Integer = 0 To 100000000 Method4(i) Next t.Stop() Console.WriteLine("Value Type - ByVal " & t.ElapsedMilliseconds) Console.ReadKey() End Sub
注释每个方法中的变量和赋值 –
>参考类型 – Passed ByRef:389ms
>参考类型 – Passed ByVal:349ms
>值类型 – Passed ByRef:416ms
>值类型 – 传递ByVal:385ms
可以得出结论,传递引用类型(字符串,类)byval将节省一些时间。您还可以说传递值类型(整数,字节) – byval将节省一些时间。
再次,时间在物质的大计划中可以忽略不计。更重要的是正确使用byval和byref,并理解幕后的情况。在你的例程中实现的算法将会更多地影响你的程序的运行时。