2009-08-07 2 views
1

кажется, присмотревшись с отражателем, что SendAsync (SmtpClient) с жетоном объекта в параметре функции ByValsendasync (smtpclient) при использовании токена отправляется byval, а не byref?

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

везде люди (включая меня), кажется, делают 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

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

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

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

Пример:

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) 

переменной х будет указывать на объект, содержащий StringBuilder"a1".
Переменная y будет Nothing.
Объект StringBuilder содержит "b2", о котором вы больше не имеете ссылки.

Смежные вопросы