Questions tagged «idisposable»

IDisposable是Microsoft .NET Framework的基类库(BCL)中的接口。它旨在提供一种通用的确定性方法来释放.NET应用程序代码中的非托管资源。

19
正确使用IDisposable接口
通过阅读Microsoft文档,我知道IDisposable接口的“主要”用途是清理非托管资源。 对我来说,“非托管”意味着诸如数据库连接,套接字,窗口句柄之类的东西。但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该处理为你。 例如: public class MyCollection : IDisposable { private List<String> _theList = new List<String>(); private Dictionary<String, Point> _theDict = new Dictionary<String, Point>(); // Die, clear it up! (free unmanaged resources) public void Dispose() { _theList.clear(); _theDict.clear(); _theList = null; _theDict = null; } 我的问题是,这是否会使垃圾收集器释放可用内存的MyCollection速度比正常情况更快? 编辑:到目前为止,人们已经发布了一些使用IDisposable清理数据库,数据库连接和位图等非托管资源的良好示例。但是假设_theList在上面的代码中包含上百万字符串,你想释放内存现在,而不是等待垃圾回收器。上面的代码能做到吗?

13
在C#中使用Finalize / Dispose方法
C#2008 我已经为此工作了一段时间,但我仍然对在代码中使用finalize和dispose方法感到困惑。我的问题如下: 我知道在处理非托管资源时我们只需要一个终结器即可。但是,如果存在调用非托管资源的托管资源,是否仍需要实现终结器? 但是,如果我开发的类不直接或间接使用任何非托管资源,是否应该实现,IDisposable以允许该类的客户端使用“ using语句”? 实现IDisposable只是为了使您的类的客户端能够使用using语句是否可行? using(myClass objClass = new myClass()) { // Do stuff here } 我在下面开发了这个简单的代码来演示Finalize / dispose的使用: public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if …

12
是否必须在请求之间处理HttpClient和HttpClientHandler?
.NET Framework 4.5中的System.Net.Http.HttpClient和System.Net.Http.HttpClientHandler实现IDisposable(通过System.Net.Http.HttpMessageInvoker)。 该using声明文件说: 通常,使用IDisposable对象时,应在using语句中声明并实例化它。 此答案使用以下模式: var baseAddress = new Uri("http://example.com"); var cookieContainer = new CookieContainer(); using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) { var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("foo", "bar"), new …



10
我应该Dispose()DataSet和DataTable吗?
DataSet和DataTable都实现IDisposable,因此,按照常规的最佳实践,我应该调用它们的Dispose()方法。 但是,到目前为止,从我读过的内容来看,DataSet和DataTable实际上没有任何非托管资源,因此Dispose()实际上并没有做什么。 另外,我不能仅仅using(DataSet myDataSet...)因为DataSet有DataTables的集合而使用。 因此,为了安全起见,我需要遍历myDataSet.Tables,处置每个DataTable,然后处置DataSet。 因此,值得在我所有的DataSet和DataTable上调用Dispose()的麻烦吗? 附录: 对于那些认为应该处置DataSet的用户:通常,处置模式是使用using或try..finally,因为您要保证将调用Dispose()。 但是,对于集合而言,这很快变得很难看。例如,如果对Dispose()的调用之一抛出异常,该怎么办?您是否吞下了它(这是“不好的”),以便您可以继续处理下一个元素? 或者,您是否建议我只调用myDataSet.Dispose(),而忘记将DataTables放置在myDataSet.Tables中?

5
将在具有空对象的using语句中调用Dispose()吗?
using在(可能)空对象上使用该语句是否安全? 考虑以下示例: class Test { IDisposable GetObject(string name) { // returns null if not found } void DoSomething() { using (IDisposable x = GetObject("invalid name")) { if (x != null) { // etc... } } } } 是否保证Dispose仅在对象不为null且不会得到的情况下才调用该方法NullReferenceException?
178 c#  idisposable  using 

5
我应该为流对象调用Close()还是Dispose()吗?
类如Stream,StreamReader,StreamWriter等工具IDisposable界面。这意味着,我们可以Dispose()对这些类的对象调用方法。他们还定义了public一种称为的方法Close()。现在,让我感到困惑的是,一旦完成对象我该怎么称呼?如果我都叫我怎么办? 我当前的代码是这样的: using (Stream responseStream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(responseStream)) { using (StreamWriter writer = new StreamWriter(filename)) { int chunkSize = 1024; while (!reader.EndOfStream) { char[] buffer = new char[chunkSize]; int count = reader.Read(buffer, 0, chunkSize); if (count != 0) { writer.Write(buffer, 0, count); } } …

7
如何防止IDisposable传播到您的所有班级?
从这些简单的类开始... 假设我有一组简单的类,如下所示: class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } A Bus有一个Driver,A 有Driver两个Shoe,每个Shoe都有一个Shoelace。一切都很傻。 将IDisposable对象添加到Shoelace 后来我决定对进行某些操作Shoelace可以是多线程的,因此我EventWaitHandle为线程添加了一个与之通信。所以Shoelace现在看起来像这样: class Shoelace { private …

9
垃圾收集器会打给IDisposable.Dispose给我吗?
.NET IDisposable模式 意味着,如果编写终结器并实现IDisposable,则终结器需要显式调用Dispose。这是合乎逻辑的,这是我在需要终结器的极少数情况下一直要做的事情。 但是,如果我这样做,会发生什么: class Foo : IDisposable { public void Dispose(){ CloseSomeHandle(); } } 并且不要实现终结器或其他任何东西。框架会为我调用Dispose方法吗? 是的,我意识到这听起来很愚蠢,所有逻辑都暗示这不会,但是我总是有两件事让我不确定。 几年前有人告诉我,实际上它会这样做,而且那个人在“知道自己的东西”方面有着非常可靠的记录。 编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)来执行其他“魔术”操作,因此这也可能是“魔术”的。 尽管我已经阅读了很多有关此方面的内容,并且暗示了很多内容,但我始终无法找到该问题的明确答案“是”或“否”。



2
ASP MVC:何时调用IController Dispose()?
我正在对其中一个较大的MVC应用程序进行大的重构/速度调整。现在已经将它部署到生产中了几个月,而我开始等待连接池中的连接等待超时。我已将问题归结为未正确处理的连接。 鉴于此,我此后对基本控制器进行了更改: public class MyBaseController : Controller { private ConfigurationManager configManager; // Manages the data context. public MyBaseController() { configManager = new ConfigurationManager(); } protected override void Dispose(bool disposing) { if (disposing) { if (this.configManager != null) { this.configManager.Dispose(); this.configManager = null; } } base.Dispose(disposing); } } 现在,我有两个问题: 我要介绍比赛条件吗?由于configManager管理DataContext暴露IQueryable<>参数给视图的,因此我需要确保Dispose()在视图完成渲染之前不会在控制器上调用该参数。 MVC框架Dispose()是在呈现视图之前还是之后在Controller上调用的?还是MVC框架将其留给GarbageCollector?

6
实体框架和调用context.dispose()
什么时候应该调用DbContext.dispose()实体框架? 这种假想的方法不好吗? public static string GetName(string userId) { var context = new DomainDbContext(); var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); return userName; } 这是否更好? public static string GetName(string userId) { string userName; using(var context = new DomainDbContext()) { userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); } return …

15
“处置”是否仅应用于包含非托管资源的类型?
我最近正在与一位同事讨论Dispose实现的价值和类型IDisposable。 我认为IDisposable,即使没有任何非托管资源需要清理,实现应尽快清理的类型也很有价值。 我的同事有不同的看法。执行IDisposable,如果你没有任何非托管资源为你的类型,最终会被垃圾收集是没有必要的。 我的观点是,如果您希望尽快关闭ADO.NET连接,则可以实施IDisposable并且using new MyThingWithAConnection()有意义。我的同事回答说,在幕后,ADO.NET连接是不受管理的资源。我对他的答复是,所有事情最终都是不受管理的资源。 我知道的建议一次性模式,你免费托管和非托管资源,如果Dispose被调用,但如果通过终结/析构函数称为唯一的免费托管资源(和博客前一阵子关于如何提醒消费者不当使用您的IDisposable类型的) 因此,我的问题是,如果您的类型不包含非托管资源,是否值得实现IDisposable?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.