草庐IT

disposing

全部标签

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用作邮件程序。 最佳答案

c# - 如果我在 using 语句结束之前返回会怎样?会调用 dispose 吗?

我有以下代码using(MemoryStreamms=newMemoryStream()){//codereturn0;}dispose()方法在using语句大括号结束时调用,对吗?由于我在using语句结束之前return,MemoryStream对象是否会被正确处理?这里发生了什么? 最佳答案 是的,Dispose将被调用。一旦执行离开using的范围,它就会被调用block,不管用什么方式离开block,block执行结束,return语句或异常。正如@Noldorin正确指出的那样,使用using代码块被编译成try/fi

c# - 不对 TPL 任务对象调用 Dispose() 是否可以接受?

我想触发一个任务在后台线程上运行。我不想等待任务完成。在.net3.5中我会这样做:ThreadPool.QueueUserWorkItem(d=>{DoSomething();});在.net4中,TPL是建议的方式。我看到推荐的常见模式是:Task.Factory.StartNew(()=>{DoSomething();});然而,StartNew()方法返回Task实现IDisposable的对象。这个似乎被推荐这种模式的人忽略了。Task.Dispose()上的MSDN文档方法说:"AlwayscallDisposebeforeyoureleaseyourlastreferen

c# - 我应该为流对象调用 Close() 还是 Dispose()?

Stream、StreamReader、StreamWriter等类实现了IDisposable接口(interface)。这意味着,我们可以在这些类的对象上调用Dispose()方法。他们还定义了一个名为Close()的public方法。现在让我感到困惑的是,一旦我处理完对象后我应该调用什么?如果我同时调用两者怎么办?我目前的代码是这样的:using(StreamresponseStream=response.GetResponseStream()){using(StreamReaderreader=newStreamReader(responseStream)){using(Str

c# - 是否会在带有空对象的 using 语句中调用 Dispose()?

在(潜在的)空对象上使用using语句是否安全?考虑以下示例:classTest{IDisposableGetObject(stringname){//returnsnullifnotfound}voidDoSomething(){using(IDisposablex=GetObject("invalidname")){if(x!=null){//etc...}}}}是否保证仅当对象不为null时才会调用Dispose,并且我不会得到NullReferenceException? 最佳答案 是的,Dispose()仅在非空对象上调用

c# - 在 C# 中使用 Finalize/Dispose 方法

C#2008我已经研究了一段时间了,但我仍然对在代码中使用finalize和dispose方法感到困惑。我的问题如下:我知道在处理非托管资源时我们只需要一个终结器。但是,如果有托管资源调用非托管资源,是否还需要实现终结器?但是,如果我开发一个不直接或间接使用任何非托管资源的类,我是否应该实现IDisposable以允许该类的客户端使用'using陈述'?实现IDisposable只是为了使您的类的客户端能够使用using语句是否可行?using(myClassobjClass=newmyClass()){//Dostuffhere}我在下面开发了这个简单的代码来演示Finalize/d