jjzjj

c# - 为什么 Dispose() 应该是非虚拟的?

我是C#的新手,如果这是一个明显的问题,我深表歉意。在MSDNDisposeexample,他们定义的Dispose方法是非虚拟的。这是为什么?这对我来说似乎很奇怪-我希望拥有自己的非托管资源的IDisposable的子类只会覆盖Dispose并在他们自己的方法底部调用base.Dispose()。谢谢! 最佳答案 典型的用法是Dispose()被重载,具有公共(public)的、非虚拟的Dispose()方法和虚拟的、protectedDispose(bool)。publicDispose()方法调用Dispose(true),子

c# - Dispose() 和 Ninject 指南

因此,我有一个从WCF服务公开的方法:publicGetAllCommentsResponseGetAllComments(GetAllCommentsRequestrequest){varresponse=newGetAllCommentsResponse();using(_unitOfWork)try{Guard.ArgNotNull(request,"request");varresults=_unitOfWork.CommentRepository.Get(d=>d.Id>0).ToArray();//...Dorestofstuffhere}catch(Exceptionex

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