我正在处理大数组,许多动态创建和销毁。现在我开始构建类的处理位,并希望避免尽可能多的不必要的减速。
我的具体问题是:如果我创建一个按名称获取数组的函数,它是否会传递对数组的引用(所需)或者创建一个重复的数组并反过来给出它?有没有办法控制这个?
以下是我正在使用的代码:
public function fetchArrayByName(name as string) as single()
for i = 0 to channels.count-1
if channelnames(i) = name then return channel(i)
next i
return nothing
end function
答案 0 :(得分:2)
如果未指定,暗示ByVal,但它实际上是对数组的引用。因此,您无法覆盖方法内的指针,但您可以更改它指向的对象。总而言之,数组(如类)实际上是通过引用传递的,不会创建重复的数组。
官方参考:Value Types and Reference Types
非官方,用户评论:Array ByVal or ByRef in VB.NET?
答案 1 :(得分:0)
数组是.NET中的引用类型,因此您的函数将返回对数组的引用。
如果你想要一个全新的阵列,你必须自己制作一个副本。
答案 2 :(得分:0)
也许一个例子会有所帮助:
Module Module1
Dim channels As New Dictionary(Of String, Single())
Function GetChannel(name As String) As Single()
If channels.ContainsKey(name) Then
Return channels(name)
End If
Return Nothing
End Function
Function GetShallowCopyOfChannel(name As String) As Single()
If channels.ContainsKey(name) Then
'TODO: if a deep clone is required, implement it.
Dim newChannel = channels(name).Clone()
Return CType(newChannel, Single())
End If
Return Nothing
End Function
Sub Main()
channels.Add("English", {1.1, 2.2, 3.3, 4.4})
channels.Add("Columbia River", {10.01, 11.11, 12.21, 13.31})
Dim ch = GetChannel("English")
If ch IsNot Nothing Then
ch(0) = 999
' shows 999 as the first element, i.e. ch is the original array
Console.WriteLine(String.Join(", ", channels("English")))
Else
'something went wrong
End If
ch = GetShallowCopyOfChannel("Columbia River")
If ch IsNot Nothing Then
ch(0) = 17
' shows 10.01 as the first element, i.e. ch is not the original array
Console.WriteLine(String.Join(", ", channels("Columbia River")))
' shows 17 as the first element, i.e. ch is a an array separate from the original
Console.WriteLine(String.Join(", ", ch))
Else
'something went wrong
End If
Console.ReadLine()
End Sub
End Module
如果您担心不必要的减速并且您有很多数组,那么您可能希望使用Dictionary来存储数组,因为它是作为哈希表实现的。