sendasync (smtpclient) при использовании токена отправляется с помощью valval, а не byref? - PullRequest
1 голос
/ 07 августа 2009

После просмотра с помощью рефлектора кажется, что sendasync (smtpclient) с маркером объекта в параметре функции имеет значение

имеет ли смысл пытаться освободить вложение в функции обратного вызова?

везде люди (включая меня), кажется, делают 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, это не должно распоряжаться исходным вложением, верно?

в моем случае, вложение - это поток памяти

1 Ответ

0 голосов
/ 07 августа 2009

Метод обратного вызова получает ссылки на исходные объекты, а не их копии.

Способ отправки аргументов по умолчанию - по значению. Если аргумент является ссылочным типом (объектом), это означает, что копия ссылки отправляется методу, а не то, что копия объекта создается и отправляется методу. Есть только один объект, но есть две ссылки на него.

Вам нужно отправлять аргумент только по ссылке, если вам нужно изменить переменную, метод все равно может получить доступ к объекту, если вы отправите аргумент по значению.

Пример:

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", на который у вас больше нет ссылки.

...