草庐IT

disposing

全部标签

c# - 在 IDisposable.Dispose 中拦截异常

在IDisposable.Dispose方法中有没有办法判断是否抛出异常?using(MyWrapperwrapper=newMyWrapper()){thrownewException("Baderror.");}如果在using语句中抛出异常,我想在释放IDisposable对象时了解它。 最佳答案 您可以扩展IDisposable用方法Complete并使用这样的模式:using(MyWrapperwrapper=newMyWrapper()){thrownewException("Baderror.");wrapper.Co

c# - Dispose() 方法中 GC.SuppressFinalize(this) 的目的是什么?

我有以下代码:publicvoidDispose(){if(_instance!=null){_instance=null;//CallGC.SupressFinalizetotakethisobjectoffthefinalization//queueandpreventfinalizationcodeforthisobjectfrom//executingasecondtime.GC.SuppressFinalize(this);}}虽然有评论解释了那个与GC相关的调用的目的,但我仍然不明白为什么它在那里。一旦所有实例不复存在,对象是否注定要进行垃圾回收,例如在usingblock

c# - Dispose,什么时候调用?

考虑以下代码:namespaceDisposeTest{usingSystem;classProgram{staticvoidMain(string[]args){Console.WriteLine("CallingTest");Test();Console.WriteLine("CalltoTestdone");}staticvoidTest(){DisposeImplementationdi=newDisposeImplementation();}}internalclassDisposeImplementation:IDisposable{~DisposeImplementati

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永远不会看到第一个异常。但是,人们通常对第一个异常更感兴趣,因为它通常会提供更好的线索,说明为