我为我的代码使用默认的IDisposable实现模板(模式)。片段:publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(boolisDisposing){if(!this.disposed){if(isDisposing){//cleanupmanagedresources}//cleanupunmanagedresourcesthis.disposed=true;}}我的问题:为什么在Dispose公共(public)方法中调用“GC.SuppressFina
我有一个Windows窗体应用程序,在该应用程序中单击某些按钮可以从第二窗体创建对象。在用户关闭此第二个表单时,此表单使用的内存不会被释放(根据任务管理器)。我尝试在退出按钮上使用this.dispose(),在主代码中使用this.close(),form2=null,并尝试在处理之前通过代码清除此表单中的所有控件。这些都不起作用,每次用户单击按钮时,应用程序的内存使用量都会增加,并且不会释放前一个实例使用的内存。我应该用什么来解决这个问题? 最佳答案 调用Dispose不会清除对象使用的内存。Dispose旨在用于运行用户定义的
publicstaticclassstClass{staticClass1obj=newClass1();publicstaticintreturnSomething(){return0;}}如果我正在调用静态函数stClass.returnSomething()在其他一些非静态类中?注意:Class1不是静态的 最佳答案 从不,如obj不执行IDisposable.如果你的意思是什么时候obj获得垃圾收集那么答案仍然是永远不会-静态字段永远不会被垃圾收集,因此obj的对象如果您设置obj,引用将仅符合垃圾收集条件为空(或其他一些对
我有许多类具有实现IDisposable的私有(private)成员变量(计时器、画笔等)。我是否需要采取任何措施来确保.NETFramework正确清理这些变量?我看到的文献是指“托管资源”与“非托管资源”。这些术语让我感到困惑,因为您可以拥有一个使用非托管资源实现功能的托管类。这被认为是“非托管资源”还是“托管资源”?我的理解是,如果您不在实现IDisposable的对象上调用Dispose(),那么在应用程序退出之前不会释放资源。这种情况在长时间运行程序时会导致OutOfMemory异常。我如何确定我的代码正确地处理了资源管理?这对这些对象很重要,因为它们是自定义控件,并且可能有
我的类实现了IDisposable并遵循了的模式publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}但sonar仍然告诉我需要实现处置模式...https://sonarqube.com/issues#issues=AVtsPLjmtpYg8Dj4z0MU这是Sonar的缺陷还是我遗漏了什么? 最佳答案 我看到你已经解决了这个问题,但如果其他人有同样的问题,我会详细说明规则要求。这条规则的想法是允许潜在的派生类正确地处理你的类的成员。因此,如果您的类是密封的,则该
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭4年前。Improvethisquestion让我们来看看臭名昭著的IDisposable接口(interface):[ComVisible(true)]publicinterfaceIDisposable{voidDispose();}和一个典型的实现,如MSDN所推荐的(我省略了当前对象是否已经被释放的检查):publicclassBase:IDisposable{protectedvirtualvoidDispose(booldisposing
问题是:为什么我们需要在某些对象上调用Dispose()?为什么垃圾收集器在超出范围时不收集对象?我试图理解为什么它是这样实现的。我的意思是,如果在垃圾收集器收集超出范围的对象时调用Dispose()会不会更容易。 最佳答案 垃圾收集器是不确定的-它会在对象不再被引用后某个时间点收集对象,但不能保证及时发生。与引用计数相比,这有很多好处,包括允许循环依赖和不在所有地方递增和递减计数器的性能优势。但是,这确实意味着对于应该及时清理的资源(例如数据库连接、文件句柄等-几乎所有内存以外的资源),您仍然需要显式处理资源。using语句使这变
我是否必须这样做才能确保正确处理MemoryStream?using(MemoryStreamstream=newMemoryStream(bytes))using(XmlReaderreader=XmlReader.Create(stream)){returnnewXmlDocument().Load(reader);}或者是否可以内联MemoryStream使其超出范围?像这样?using(XmlReaderreader=XmlReader.Create(newMemoryStream(bytes))){returnnewXmlDocument().Load(reader);}
我知道我之前问过一个相关问题。我只是有另一个想法。using(SqlConnectionconn=newSqlConnection('blahblah')){using(SqlCommandcmd=newSqlCommand(sqlStatement,conn)){conn.open();//***doIneedtoputthisinusingaswell?***SqlDataReaderdr=cmd.ExecuteReader(){While(dr.Read()){//readhere}}}}论点是:由于SqlDataReaderdr对象不是像连接或命令对象那样的新对象,它只是指向c
显然,在使用嵌套的using语句时,一些异常可能会丢失。考虑这个简单的控制台应用程序:usingSystem;namespaceConsoleApplication{publicclassThrowing:IDisposable{intn;publicThrowing(intn){this.n=n;}publicvoidDispose(){vare=newApplicationException(String.Format("Throwing({0})",this.n));Console.WriteLine("Throw:{0}",e.Message);throwe;}}classPr