ImageList byref还是byval?

时间:2017-11-05 14:43:40

标签: vb.net

我将ImageList传递给用户控件。

我已经读过ByVal允许更改对象,但只有ByRef允许将对象设置为其他内容。

在我的代码中,我将图像列表设置为Nothing,以便知道图像列表已被破坏。

是否仍允许将图像列表作为ByVal传递,还是应该在这种情况下使用ByRef?

"没有什么"不是一个对象,它是什么"没什么",对吧?

3 个答案:

答案 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)

obj1Nothing时,您会发现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查看网站的属性时,其属性也已更改,因为aWebPageaWebPage都包含相同的链接(或在.net中,相同参考)到同一个网页,所以改变一个,改变两个变量,因为你正在改变同一个网页。

清除?我怀疑没有 - 我花了很多时间来适应价值类型和参考类型。