2009-08-07 34 views
1

看起來,在用反射器查看後,在函數的參數中帶有對象標記的sendasync(smtpclient)是byval使用令牌時sendasync(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) 

變量x現在將指向含有"a1"一個StringBuilder對象。
變量y將是Nothing
有一個StringBuilder對象,其中包含"b2",您不再提及。

相關問題