lom*_*axx 3 c# dispose idisposable
我今天正在处理一些使用System.Net.Mail.MailMessage类的代码
public MailMessage CreateMessage(string fromAddress, string recipient)
{
MailMessage message = new MailMessage(fromAddress, recipient);
message.Subject = subject;
message.Body = body;
return message;
}
Run Code Online (Sandbox Code Playgroud)
忽略了这种方法的微不足道的性质,我得到了编译器警告说
对象'消息'未沿所有异常路径放置.在对所有引用超出范围之前,调用System.IDisposable.Dispose对象'message'.
这很有意思,因为编译器警告消息在超出范围之前没有处理,但是我会假设返回对它的引用意味着虽然消息变量超出范围,但仍然是基础对象,在这种情况下,我非常怀疑我会想要处理它.
这让我有点困惑,因为警告信息的含义是你不应该返回一次性物品.这是真的如此,还是这只是一个编译器警告疯狂的情况?
这个警告的意思是,如果方法抛出(例如在Subject设置器中),你可能会留下一个MailMessage没有任何参考的未曝光.
你应该通过这样的事情来防止这种情况发生:
public MailMessage CreateMessage(string fromAddress, string recipient)
{
MailMessage message = new MailMessage(fromAddress, recipient);
try {
message.Subject = subject;
message.Body = body;
return message;
}
catch {
if (message != null) {
message.Dispose();
}
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器没有任何反对返回IDisposable实例:)