内容简介:你这样做的根本错误.一个很好的规则要记住,如果你认为你需要一个析构函数,那么99.9%的时间你就错了.只有拥有需要释放的非托管类型的私有变量时,才需要析构函数.你没有.你可以告诉你做错的方法是当你发现如果处理参数为假,你根本没有做任何事情.或者换句话说,析构函数实际上并没有做任何事情.所以不需要它.那么你也不需要一次性图案.还有更多的错误,你需要继承IDisposable接口来实现自己的Dispose()方法.你忘了.您的Dispose()方法需要由创建Email类实例的客户端代码调用.您不能自己调用它
bool>发送我的问题是:异步方法完成后,正常的IDisposable实现是否会配置私有变量?这是我正在谈论的课程的一个例子:
public class Email : IEmail
{
private readonly IEmailData _EmailData;
private MailMessage _MailMessage = new MailMessage();
public Email(IEmailData emailData)
{
if (emailData == null)
{
throw new ArgumentNullException("emailData");
}
if (String.IsNullOrEmpty(emailData.To))
{
throw new ArgumentNullException("emailData.To");
}
if (String.IsNullOrEmpty(emailData.From))
{
throw new ArgumentNullException("emailData.From");
}
if (String.IsNullOrEmpty(emailData.FromName))
{
throw new ArgumentNullException("emailData.FromName");
}
if (String.IsNullOrEmpty(emailData.Subject))
{
throw new ArgumentNullException("emailData.Subject");
}
if (String.IsNullOrEmpty(emailData.Body))
{
throw new ArgumentNullException("emailData.Body");
}
_EmailData = emailData;
}
async public Task<bool> Send()
{
return await Task.Run<bool>(() =>
{
using (SmtpClient smtp = new SmtpClient())
{
smtp.Send(_MailMessage);
}
return true;
});
}
#region "IDisposable implementation"
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~Email()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_MailMessage != null)
_MailMessage.Dispose();
}
}
#endregion
}
我根据建议不使用析构函数的答案之一更改了IDisposable实现:
#region "IDisposable implementation"
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (_MailMessage != null)
_MailMessage.Dispose();
}
}
#endregion
你这样做的根本错误.一个很好的规则要记住,如果你认为你需要一个析构函数,那么99.9%的时间你就错了.只有拥有需要释放的非托管类型的私有变量时,才需要析构函数.你没有.你可以告诉你做错的方法是当你发现如果处理参数为假,你根本没有做任何事情.或者换句话说,析构函数实际上并没有做任何事情.所以不需要它.那么你也不需要一次性图案.
还有更多的错误,你需要继承IDisposable接口来实现自己的Dispose()方法.你忘了.
您的Dispose()方法需要由创建Email类实例的客户端代码调用.您不能自己调用它,您不知道客户端代码何时停止使用您的Email对象.这是对您的问题的快速回答,您不能将自己置于Send()方法中.无法保证客户端代码实际上会调用它.您必须将其留给客户端代码以使其正确.
翻译自:https://stackoverflow.com/questions/18849825/async-await-and-the-idisposable-interface
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 接口测试及常用接口测试工具
- Java中的Comparable接口和Comparator接口
- Java 的 Closeable 接口和 Cloneable 接口
- python接口自动化测试之接口数据依赖
- Kotlin 接口与 Java8 新特性接口
- Java接口全链路优化:如何降低接口RT时长
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Computer Age Statistical Inference
Bradley Efron、Trevor Hastie / Cambridge University Press / 2016-7-21 / USD 74.99
The twenty-first century has seen a breathtaking expansion of statistical methodology, both in scope and in influence. 'Big data', 'data science', and 'machine learning' have become familiar terms in ......一起来看看 《Computer Age Statistical Inference》 这本书的介绍吧!