2009-08-07 8 views
1

es scheint, nachdem sie mit Reflektor suchen, dass die SendAsync (SmtpClient) mit den Objekt-Token in dem Parameter der Funktion byval istsendasync (smtpclient) bei der Verwendung des Tokens wird byval und nicht byref gesendet?

macht es Sinn, zu versuchen, die Anlage in der Callback-Funktion freigeben?

überall Leute scheinen (mich eingeschlossen) SendAsync (Mailmessage, Mailmessage)

und in der Callback (SendCompletedCallback) etwas zu tun, wie zu tun:

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() 

aber da die SendAsync byval ist, sollte das den Original-Aufsatz nicht entsorgen, oder?

in meinem Fall Befestigung sind Memory

Antwort

0

Die Callback-Methode auf die Original-Objekte erhält, keine Kopien von ihnen.

Die Standardmethode zum Senden von Argumenten ist der Wert. Wenn das Argument ein Referenztyp (Objekt) ist, bedeutet dies, dass eine Kopie der Referenz an die Methode gesendet wird, nicht dass eine Kopie des Objekts erstellt und an die Methode gesendet wird. Es gibt immer noch nur ein Objekt, aber es gibt zwei Referenzen darauf.

Sie müssen ein Argument nur als Referenz senden, wenn Sie die Variable ändern müssen. Die Methode kann weiterhin auf das Objekt zugreifen, wenn Sie das Argument nach Wert senden.

Beispiel:

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 

Aufruf der Methode:

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

Die Variable x wird jetzt auf einen StringBuilder Objekt enthält "a1".
Die Variable y wird Nothing sein.
Es gibt ein StringBuilder Objekt, das "b2" enthält, auf das Sie keinen Bezug mehr haben.