草庐IT

disposable

全部标签

c# - .Net/C# 对象应该自己调用 Dispose() 吗?

下面是同事写的一些示例代码。这对我来说显然是错误的,但我想检查一下。一个对象是否应该从它自己的方法之一中调用它自己的Dispose()方法?在我看来,只有对象的所有者/创建者才应该在处理对象而不是对象本身时调用Dispose()。这是一个.asmx网络方法,它在完成后会自行调用Dispose()。(事实上​​它是一个web方法可能是一般问题的附带问题。)在我们的代码库中,我们有时会在其他web服务的方法中实例化web服务类,然后调用它们的方法。如果我的代码这样做是为了调用此方法,则当该方法返回时该对象就完蛋了,我不能再真正使用该对象了。[WebMethod]publicstringMy

c# - 如果我不在笔对象上调用 Dispose 会发生什么?

如果我不打电话会怎样Dispose在pen此代码片段中的对象?privatevoidpanel_Paint(objectsender,PaintEventArgse){varpen=Pen(Color.White,1);//Dosomedrawing} 最佳答案 PenGC将在future某个不确定的时间点收集,无论您是否调用Dispose.但是,笔持有的任何非托管资源(例如,GDI+句柄)都不会被GC清除。GC只清理托管资源。调用Pen.Dispose允许您确保及时清理这些非托管资源,并且不会泄漏资源。现在,如果Pen有一个终结器

c# - 我应该始终断开 Dispose 方法中的事件处理程序吗?

我在C#工作,我的工作场所有一些代码标准。其中之一是我们连接的每个事件处理程序(例如KeyDown)都必须在Dispose方法中断开连接。这有什么充分的理由吗? 最佳答案 除非您希望事件的发布者比订阅者活得更久,否则没有理由删除事件处理程序,不。这是民间传说发展起来的主题之一。你真的只需要用正常的术语来考虑它:发布者(例如按钮)有一个对订阅者的引用。如果发布者和订阅者同时有资格进行垃圾回收(这很常见),或者发布者更早有资格进行垃圾回收,那么就不存在GC问题。p>静态事件会导致GC问题,因为它们实际上是一个无限长生命周期的发布者-我会

c# - 使用语句与 IDisposable.Dispose()

据我了解,usingstatement在.NET中,一旦代码退出block,就会调用IDisposable对象的Dispose()方法。using语句还做其他事情吗?如果不是,那么以下两个代码示例似乎实现了完全相同的事情:UsingConasNewConnection()Con.Open()'dowhatever'EndUsingDimConasNewConnection()Con.Open()'dowhatever'Con.Dispose()谁确认我是对的,谁指出我错了并说明原因,我将给出最佳答案。请记住,我知道某些类可以在它们的Dispose()方法中做不同的事情。这个问题是关于u

c# - 您是否应该实现 IDisposable.Dispose() 以使其永远不会抛出?

对于C++中的等效机制(析构函数),建议是itshouldusuallynotthrowanyexceptions.这主要是因为这样做可能会终止您的进程,这很少是一个好策略。在.NET中的等效场景中......抛出第一个异常finallyblock作为第一个异常的结果执行finallyblock调用Dispose()方法Dispose()方法抛出第二个异常...您的进程不会立即终止。但是,您会丢失信息,因为.NET粗暴地将第一个异常替换为第二个异常。因此,调用堆栈上方某处的catchblock永远不会看到第一个异常。但是,人们通常对第一个异常更感兴趣,因为它通常会提供更好的线索,说明为

c# - MemoryStream.Close() 或 MemoryStream.Dispose()

我应该调用哪个?有必要两者都调用吗?如果我已经调用了其中一个,另一个会抛出异常吗? 最佳答案 Close()和Dispose()在MemoryStream上调用时,仅用于做两件事:将对象标记为已处置,以便将来意外使用该对象时会引发异常。可能1释放对托管对象的引用,这可以使GC的工作更容易一些,具体取决于GC实现。(在今天的GC算法中,它没有真正的区别,所以这是一个学术讨论的观点,对现实世界没有重大影响。)MemoryStream没有任何非托管资源可供处置,因此从技术上讲您不必处置它。不处理MemoryStream的效果与删除对byt

c# - Stream.Dispose 是否总是调用 Stream.Close(和 Stream.Flush)

如果我有以下情况:StreamWriterMySW=null;try{StreamMyStream=newFileStream("asdf.txt");MySW=newStreamWriter(MyStream);MySW.Write("blah");}finally{if(MySW!=null){MySW.Flush();MySW.Close();MySW.Dispose();}}我是否可以只调用MySW.Dispose()并跳过关闭,即使它已提供?是否有任何Streamimplimentations无法按预期工作(如CryptoStream)?如果不是,那么下面就是错误的代码:us

C# Form.Close 与 Form.Dispose

我是C#的新手,我试图查看之前的帖子,但没有找到好的答案。在具有单个窗体的C#Windows窗体应用程序中,使用Form.Close()还是使用Form.Dispose()更好?MSDN表示对象内的所有资源都已关闭,并且在调用Close时会释放表单。尽管如此,我还是在网上遇到了几个遵循Dispose而不是Close的示例。一个人比另一个人有优势吗?在哪些情况下我们应该更喜欢其中一种? 最佳答案 ThisMSDN上的论坛告诉你。Form.Close()sendstheproperWindowsmessagestoshutdownthe

c# - 在 using 语句中抛出异常时,是否仍会调用 Dispose?

在下面的示例中,如果在using语句中抛出异常,连接是否会关闭并释放?using(varconn=newSqlConnection("...")){conn.Open();//stuffhappenshereandexceptionisthrown...}我知道下面的这段代码将确保它确实如此,但我很好奇using语句是如何做到的。varconn;try{conn=newSqlConnection("...");conn.Open();//stuffhappenshereandexceptionisthrown...}//catchitorletitbubbleupfinally{con

c# - 在 .NET 4.0 下使用 SmtpClient、SendAsync 和 Dispose 的最佳实践是什么

我对如何管理SmtpClient有点困惑,因为它是一次性的,尤其是当我使用SendAsync进行调用时。据推测,在SendAsync完成之前我不应该调用Dispose。但是我应该调用它吗(例如,使用“使用”)。该场景是一个WCF服务,它会在调用时定期发送电子邮件。大多数计算速度很快,但发送电子邮件可能需要一秒钟左右的时间,因此异步会更可取。每次发送邮件时都应该创建一个新的SmtpClient吗?我应该为整个WCF创建一个吗?帮助!更新如果有所不同,每封电子邮件始终是为用户定制的。WCF托管在Azure上,Gmail用作邮件程序。 最佳答案