我将ImageList传递给用户控件。
我已经读过ByVal允许更改对象,但只有ByRef允许将对象设置为其他内容。
在我的代码中,我将图像列表设置为Nothing,以便知道图像列表已被破坏。
是否仍允许将图像列表作为ByVal传递,还是应该在这种情况下使用ByRef?
"没有什么"不是一个对象,它是什么"没什么",对吧?
答案 0 :(得分:0)
如果将变量作为参数传递给声明为ByVal
的参数的方法,那么该方法完成后该变量仍将引用同一个对象,而不管您为该参数内部分配的内容是什么方法。如果您希望能够通过分配方法内的参数来更改变量引用的内容,那么该参数必须声明为ByRef
。
如果你有这些方法:
Private Sub PassByValue(obj As Object)
obj = Nothing
End Sub
Private Sub PassByReference(ByRef obj As Object)
obj = Nothing
End Sub
你这样做:
Dim obj1 As New Object
Dim obj2 As New Object
PassByValue(obj1)
PassByReference(obj2)
当obj1
为Nothing
时,您会发现obj2
不是Nothing
。
答案 1 :(得分:0)
在这种情况下,如果您将ImageList
作为参数传递给方法,请在ImageList
上的该方法中执行一些逻辑,然后将其设置为Nothing
您将需要使用ByRef
,以便ImageList
的更改可以在方法之外保留。对于任何其他情况,您无需使用ByRef
。
答案 2 :(得分:0)
ImageList是一种引用类型,因此当您将其传递给函数或子函数时,这意味着您要将引用传递给列表,而不是复制列表本身。函数或子列表中的任何更改都将更改原始列表本身。例如..在下面的代码中,即使使用football
传递byval
对象(它是引用类型),并更改bl
对象的属性,{{即使您已通过.Diameter
而不是football
ByVal
的属性也会更改
ByRef
对网页进行成像。这是你的对象。它具有各种属性,如文本,边距,颜色和各种各样的东西。
还可以想象声明一个名为Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ChangeDiameter(football)
End Sub
Public Class Ball
Public Property Colour As Color
Public Property Diameter As Single
End Class
Dim football As New Ball With {.Colour = Color.White, .Diameter = 20}
Public Sub ChangeDiameter(ByVal bl As Ball)
bl.Diameter = 5
MessageBox.Show("Supposedly byval ball diameter =" & bl.Diameter.ToString)
MessageBox.Show("original ball diameter =" & football.Diameter.ToString)
End Sub
的变量,其中包含指向网站的链接,通过此变量,您可以更改网站的属性。变量本身只保存链接,而不是网页。
如果然后将保存链接的变量传递给另一个过程,并在另一个过程中调用变量aWebPage
,则可以在过程中使用anotherWebPage
以相同的方式更改网页的属性,但你正在改变的仍然是网站。
当您使用anotherWebPage
查看网站的属性时,其属性也已更改,因为aWebPage
和aWebPage
都包含相同的链接(或在.net中,相同参考)到同一个网页,所以改变一个,改变两个变量,因为你正在改变同一个网页。
清除?我怀疑没有 - 我花了很多时间来适应价值类型和参考类型。