2017-11-05 10 views
-1

私はUserControlにImageListを渡しています。ImageList byref or byval?

私はByValがオブジェクトを変更できることを読んだが、ByRefだけがオブジェクトを別のものに設定できることを読んだ。

私のコードでは、イメージリストが破棄されたことを知るために、ある時点でイメージリストをNothingに設定しています。

イメージリストをByValとして渡すことは許可されますか、この場合はByRefを使用する必要がありますか?

「Nothing」はオブジェクトではなく、「Nothing」です。

+0

「何もない」はオブジェクトではありません。しかし、変数をNothingに設定しても実際にはそれが破棄されるわけではありません。変数がそのオブジェクトを参照していないことを意味します。したがって、他の変数がそのオブジェクトへの参照を保持していなければ、オブジェクトはガベージコレクションされる可能性があります。しかし、あなたの質問は不明です。変数をNothingに設定する前または後に、ByValまたはByRefを使用する必要があるかどうかを確認していますか? – DodgyCodeException

+0

ImageListは、これを理解するのが難しいですが、ListViewコントロールとTreeViewコントロールのイメージソースとしてのみ便利です。だからあなたは通常、UserControlがそれを消費し、それを処分するのを世話すると仮定します。それであなたはもはや何が起こったのか気にしません。 ImageListがList(Of Image)の代わりになるとは決して考えないでください。 –

答えて

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) 

あなたはobj2NothingでないNothingながらobj1があることがわかります。 ImageListが、その後Nothingに設定すると、この場合には

0

、あなたがメソッドの引数としてごImageListを渡している場合は、あなたがそうByRefを使用する必要があります、そのメソッド内のいくつかのロジックを実行ImageListに変更することができますメソッドの外側に存続する。それ以外の場合はByRefを使用する必要はありません。

0

ImageListは参照型であるため、関数またはサブに渡すときは、コピーリスト自体ではなく、リストへの参照を渡すことを意味します。渡されたリストへの関数またはサブの変更は、元のリスト自体を変更します。たとえば、..次のコードでは、byvalを使用してbyvalを使用してfootballオブジェクト(参照型)を渡しても、.Diameterプロパティがfootballに変更されたとしても、blオブジェクトのプロパティが変更されます。それは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 

Webページのイメージング。これがあなたの目的です。テキスト、マージン、色などあらゆる種類のものがあります。

また、ウェブサイトへのリンクを含むaWebPageという変数を宣言すると、この変数によってウェブサイトのプロパティを変更できます。変数自体はリンクを保持し、Webページは保持しません。

そのリンクを保持する変数を別のプロシージャに渡し、その別のプロシージャで変数anotherWebPageを呼び出す場合は、同じ手順でanotherWebPageを使用してWebページのプロパティを変更し、あなたが変えているのはまだウェブサイトです。

Webサイトのプロパティを表示するaWebPageを使用する場合、両方のaWebPageanotherWebPage両方がそう1を変更し、同じWebページに同じリンク(または.NETで、同じ参照)を保持するので、その性質はまた、変更されています同じWebページを変更しているため、両方の変数が変更されます。

クリア?私は価値のタイプと参照タイプに慣れていく年月がかかりました。

関連する問題