2009-08-07 58 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",您不再提及。

相关问题