在实现IDisposable的类上正确使用Dispose方法

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'.

这很有意思,因为编译器警告消息在超出范围之前没有处理,但是我会假设返回对它的引用意味着虽然消息变量超出范围,但仍然是基础对象,在这种情况下,我非常怀疑我会想要处理它.

这让我有点困惑,因为警告信息的含义是你不应该返回一次性物品.这是真的如此,还是这只是一个编译器警告疯狂的情况?

Jon*_*Jon 7

这个警告的意思是,如果方法抛出(例如在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实例:)