2009-08-07 6 views
1

関数のパラメータにあるオブジェクトトークンを持つsendasync(smtpclient)がリフレクタを参照した後に、コールバック関数で添付ファイルを解放しようとすると意味がありますか?sendasync(smtpclient)トークンを使用しているときはbyrefではなくbyvalで送信されますか?

世界中の人々が(自分を含む)のようなものをやってsendasync(はMailMessage、はMailMessage)

とコールバック(SendCompletedCallback)での操作を行うように見える:

Dim mail As Net.Mail.MailMessage = CType(e.UserState, Net.Mail.MailMessage) 

For i = (mail.Attachments.Count - 1) To 0 Step -1 
    mail.Attachments(i).Dispose() 
Next 

mail.Dispose() 

しかしsendasyncがBYVALであることから、それがすべき元の添付ファイルを破棄しないでください。私の場合は

、添付ファイルは、コールバックメソッドは、元のオブジェクトではなく、それらのコピーへの参照を取得し、MemoryStreamを

答えて

0

です。

引数を送信するデフォルトの方法は値です。引数が参照型(オブジェクト)の場合、参照のコピーがメソッドに送信され、オブジェクトのコピーが作成されてメソッドに送信されるわけではありません。まだオブジェクトは1つしかありませんが、2つのオブジェクトが参照されています。

変数を変更する必要がある場合は、参照のみで引数を送信する必要があります。値で引数を送信すると、メソッドは引き続きオブジェクトにアクセスできます。

例:

Sub Test(ByVal x As StringBuilder, ByRef y As StringBuilder) 
    ' accessing the objects 
    x.Append("1") 
    y.Append("2") 
    ' remove the copy of the reference to x 
    x = Nothing 
    ' remove the reference to y 
    y = Nothing 
End Sub 

メソッドを呼び出す:

Dim x As New StringBuilder("a") 
Dim y As New StringBuilder("b") 
Test(x, y) 

変数xは現在"a1"を含むStringBuilderオブジェクトを指します。
変数yはNothingになります。
"b2"を含むStringBuilderオブジェクトがあります。このオブジェクトは参照できません。

関連する問題