Tag: idisposable

拥有一次性田地的类型应该是一次性的。 怎么解决这个警告?

我尝试在VisualStudio 2012使用“运行代码分析”选项,因此我收到了警告 CA1001 Types that own disposable fields should be disposable Implement IDisposable on ‘DBConnectivity’ because it creates members of the following IDisposable types: ‘SqlConnection’, ‘SqlCommand’. 我在SO中提到了一些问题,但是我无法IDisposable和以下是该类,负责此警告。 class DBConnectivity { public SqlConnection connection = null; public SqlCommand command = null; public SqlDataReader dataReader = null; public string connectionString = null; public List masterTableList; public DBConnectivity() […]

为什么总是需要在具有IDisposable成员的对象上实现IDisposable?

据我所知,这是一个公认的规则,如果你有一个类A具有IDisposable成员m,A应该实现IDisposable,它应该调用它内部的m.Dispose()。 我找不到令人满意的理由,为什么会这样。 我理解规则如果你有非托管资源,你应该提供一个终结器和IDisposable,这样如果用户没有显式调用Dispose,终结器仍将在GC期间清理。 但是,根据该规则,您似乎不需要具有此问题的规则。 例如… 如果我有课: class MyImage{ private Image _img; … } 约定规定我应该有MyImage : IDisposable 。 但是如果Image遵循惯例并实现了终结器而我不关心资源的及时发布,那有什么意义呢? UPDATE 我在这里找到了一个很好的讨论。

如果实例已经处理掉,在不调用EndXXX的情况下调用BeginXXX是否安全

使用异步编程模型时 ,通常建议将每个BeginXXX与EndXXX匹配,否则在异步操作完成之前可能会泄漏资源。 如果类实现了IDisposable并且通过调用Dispose实例,情况仍然如此吗? 例如,我在UdpListener使用UdpClient.BeginReceive : class UdpListener : IDisposable { private bool _isDisposed; private readonly IPAddress _hostIpAddress; private readonly int _port; private UdpClient _udpClient; public UdpListener(IPAddress hostIpAddress, int port) { _hostIpAddress = hostIpAddress; _port = port; } public void Start() { _udpClient.Connect(_hostIpAddress, _port); _udpClient.BeginReceive(HandleMessage, null); } public void Dispose() { if (_isDisposed) { throw new […]

如果我在方法中的using块内返回一个值,那么在返回之前是否使用了对象的处理?

我正在ASP.NET应用程序中查看一些旧的C#.NET代码,确保所有SqlConnections都使用块包装。 我知道使用与try / finally相同,无论try中发生什么,它都会在finally中处理对象。 如果我有一个方法在using中返回一个值,即使execute返回时执行离开了方法,它仍然会在返回之前/期间/之后调用我的对象上的.Dispose()吗? public static SqlCommand getSqlCommand(string strSql, string strConnect){ using (SqlConnection con = new SqlConnection(strConnect)) { con.Open(); SqlCommand cmd = GetSqlCommand(); cmd.Connection = con; cmd.CommandText = strSql; return cmd; } } 更新:接受的答案是我认为最能回答我的问题的答案,但请注意, 这个答案抓住了这段代码的愚蠢,我正在返回一个使用已处理连接的命令! :P

IDispospos GC.SuppressFinalize(this)位置

我为我的代码使用默认的IDisposable实现模板(模式)。 片段: public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool isDisposing) { if (!this.disposed) { if (isDisposing) { //cleanup managed resources } //cleanup unmanaged resources this.disposed = true; } } 我的问题:为什么在Dispose公共方法中调用“GC.SuppressFinalize(this)”? 在处置受管资源之后,我会在受保护方法的“if(isDisposing)”部分中放置“GC.SuppressFinalize(this)”。 像这样: protected virtual void Dispose(bool isDisposing) { if (!this.disposed) { if (isDisposing) { //cleanup managed resources GC.SuppressFinalize(this); } //cleanup unmanaged […]

如何正确处理WebResponse实例?

通常,使用WebRequest编写类似这样的代码来下载一些数据。 using(WebResponse resp = request.GetResponse()) // WebRequest request… using(Stream str = resp.GetResponseStream()) ; // do something with the stream str 现在,如果抛出WebException,WebException会引用WebResponse对象,该对象可能会也可能不会调用Dispose(取决于发生exception的位置,或者响应类的实现方式) – 我不知道。 我的问题是如何处理这个问题。 是否应该编写一个非常防御性的编码,并在WebException对象中处理响应(这有点奇怪,因为WebException不是IDisposable)。 或者是否应该忽略这一点,可能访问已处置的对象或永远不会丢弃IDisposable对象? WebException.Response的MSDN文档中给出的示例完全不合适。

我什么时候可以处理IDisposable WPF控件,例如WindowsFormsHost?

WPF控件WindowsFormsHostinheritance自IDisposable。 如果我有一个包含上述某些控件的复杂WPF可视树,我可以使用哪些事件或方法在关机期间调用IDispose?

忽略IDisposable会导致内存泄漏吗?

在我写的答案的评论中,我们讨论了内存泄漏和IDisposable ,我们没有得出任何真正的结论。 处理非托管资源的类可能实现IDisposable 。 如果忽略它并且既没有调用Dispose也没有在using包装对象 – 会导致非托管资源被泄露吗? 或者,当GC收集物体时,它会被正确清理吗? 我们可以假设处理非托管资源的类具有IDisposable的正确实现,包括终结器等。

终结器和处理

我有一个名为BackgroundWorker的类,它有一个不断运行的线程。 要关闭此线程,名为stop to的实例变量必须为true 。 为了确保在使用完类时释放线程,我添加了IDisposable和一个调用Dispose()的终结器。 假设stop = true确实导致此线程退出,这个sippet是否正确? 可以从终结器中调用Dispose ,对吗? 如果objectinheritance了IDisposable ,终结器应该总是调用Dispose ,对吧? /// /// Force the background thread to exit. /// public void Dispose() { lock (this.locker) { this.stop = true; } } ~BackgroundWorker() { this.Dispose(); }

将类型转换为IDisposable – 为什么?

看到这个。 为什么显式转换为IDisposable? 这只是确保在退出使用块时调用IDisposable的简写吗? using (proxy as IDisposable) { string s = proxy.Stuff() }