sendasync (smtpclient) при использовании токена отправляется byval, а не byref?

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

в моем случае вложение - это memorystream


person Fredou    schedule 07.08.2009    source источник


Ответы (1)


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

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

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

Пример:

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

person Guffa    schedule 07.08.2009