jjzjj

idisposable-cheat-sheet

全部标签

c# - 检测 "leaked"IDisposable 对象

有很多问题询问如何检测IDisposable对象泄漏。答案似乎是"youcan't".我刚刚检查了最简单的测试用例,FxCop10.0不执行此操作,带有MSVS2010的ReSharper4不执行此操作。这对我来说似乎是错误的,比C中的内存泄漏更糟糕(至少我们已经建立了检测工具)。我在想:是否有可能,使用反射和其他晦涩的高级技术,我可以在运行时注入(inject)一个检查,在终结器中查看是否调用了Dispose?用WinDBG+SOS变魔术怎么样?即使没有现成的工具可以做到这一点,我也想知道这在理论上是否可行(我的C#不是很熟练)。想法?注意这个问题的标题可能具有误导性。这里真正的问题

c# - 是否有必要将 usings 与 IDisposable 对象嵌套在一起?

我是否必须将所有IDisposable对象包装在using(){}语句中,即使我只是将一个对象传递给另一个对象?例如,在下面的方法中:publicstaticstringReadResponse(HttpWebResponseresponse){stringresp=null;using(StreamresponseStream=response.GetResponseStream()){using(StreamReaderresponseReader=newStreamReader(responseStream)){resp=responseReader.ReadToEnd();}}

c# - IDisposable GC.SuppressFinalize(this) 位置

我为我的代码使用默认的IDisposable实现模板(模式)。片段:publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}protectedvirtualvoidDispose(boolisDisposing){if(!this.disposed){if(isDisposing){//cleanupmanagedresources}//cleanupunmanagedresourcesthis.disposed=true;}}我的问题:为什么在Dispose公共(public)方法中调用“GC.SuppressFina

c# - 误报 : Fix this implementation of IDisposable to conform to the dispose pattern

我的类实现了IDisposable并遵循了的模式publicvoidDispose(){Dispose(true);GC.SuppressFinalize(this);}但sonar仍然告诉我需要实现处置模式...https://sonarqube.com/issues#issues=AVtsPLjmtpYg8Dj4z0MU这是Sonar的缺陷还是我遗漏了什么? 最佳答案 我看到你已经解决了这个问题,但如果其他人有同样的问题,我会详细说明规则要求。这条规则的想法是允许潜在的派生类正确地处理你的类的成员。因此,如果您的类是密封的,则该

c# - 为什么 IDisposable 实现是这样设计的

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭4年前。Improvethisquestion让我们来看看臭名昭著的IDisposable接口(interface):[ComVisible(true)]publicinterfaceIDisposable{voidDispose();}和一个典型的实现,如MSDN所推荐的(我省略了当前对象是否已经被释放的检查):publicclassBase:IDisposable{protectedvirtualvoidDispose(booldisposing

C# 使用 IDisposable 还是 SafeHandle?

我已经阅读了很多有关C#中的终结器和IDisposable的内容。当我终于从对终结器和IDisposable的巨大困惑中清醒过来时,突然间,不知从哪里冒出来了这个SafeHandle东西。我的信念再次彻底动摇了。我应该使用什么? 最佳答案 SafeHandle仅在处理Win32Interop调用时有用。在Win32中,大多数东西都是用“句柄”来表示的。这包括Windows、Mutexes等。因此.NETSafeHandle使用一次性模式来确保正确关闭Win32句柄。因此,如果您正在使用Win32Interop调用并取回Win32句柄

c# - 如果它是 IDisposable,我可以 "inline"变量吗?

我是否必须这样做才能确保正确处理MemoryStream?using(MemoryStreamstream=newMemoryStream(bytes))using(XmlReaderreader=XmlReader.Create(stream)){returnnewXmlDocument().Load(reader);}或者是否可以内联MemoryStream使其超出范围?像这样?using(XmlReaderreader=XmlReader.Create(newMemoryStream(bytes))){returnnewXmlDocument().Load(reader);}

c# - 在 IDisposable 类层次结构中正确处理 ObjectDisposedException

关闭。这个问题需要更多focused.它目前不接受答案。想改善这个问题吗?更新问题,使其仅关注一个问题editingthispost.3年前关闭。Improvethisquestion正确实现IDisposable时,大多数实现,包括框架指南,都建议包含privatebooldisposed;成员,以便安全地允许多次调用Dispose(),Dispose(bool)以及扔ObjectDisposedException在适当的时候。这适用于单个类。但是,当您从一次性资源进行子类化,并且子类包含它自己的native资源和独特的方法时,事情就会变得有点棘手。大多数示例展示了如何覆盖Dipos

c# - 我什么时候可以处理 IDisposable WPF 控件,例如Windows 窗体主机?

WPF控件WindowsFormsHost继承自IDisposable。如果我有一个包含上述某些控件的复杂WPF可视化树,我可以使用什么事件或方法在关闭期间调用IDispose? 最佳答案 在应用程序关闭的情况下,您无需执行任何操作即可正确处理WindowsFormsHost。由于它派生自HwndHost,因此在Dispatcher关闭时处理处理。如果您使用Reflector,您会看到在初始化HwndHost时它会创建一个WeakEventDispatcherShutdown。如果您在对话框中使用它,我建议的最好的办法是覆盖OnCl

c# - 忽略 IDisposable 会导致内存泄漏吗?

在answerIwrote的评论中我们讨论了内存泄漏和IDisposable,但我们没有得出任何真正的结论。处理非托管资源的类可能会实现IDisposable。如果忽略它并且既不调用Dispose也不将对象包装在using中-这会导致非托管资源被泄漏吗?还是会在GC回收对象的时候进行适当的清理?我们可以假设处理非托管资源的类具有IDisposable的正确实现,包括终结器等。 最佳答案 它不会导致内存泄漏。事实上,Dispose与内存管理完全无关。它将造成资源泄漏。虽然GC通常会清理它,但这可能太少也太晚了。省略Dispose(us