1

リフレクターで調べたところ、関数のパラメーターにオブジェクト トークンを持つ sendasync(smtpclient) が 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 であるため、元の添付ファイルを破棄するべきではありませんよね?

私の場合、添付ファイルはメモリストリームです

4

1 に答える 1

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は、StringBuilderを含むオブジェクトを指すようになります"a1"
変数yはになりますNothing。参照がなくなっ
StringBuilderオブジェクトが含まれています。"b2"

于 2009-08-07T15:56:16.207 に答える