Tag: 处置

如何检查对象是否已经在C#中处置

可能重复: 如何判断是否放置了一个IDisposable对象引用? 有没有一种方法来检查对象是否被处置不同呢 try { myObj.CallRandomMethod(); } catch (ObjectDisposedException e) { // now I know object has been disposed } 在我的情况下,我使用具有Close()方法的TcpClient类来处理对象,这可能发生在我无法控制的代码段中。 在这种情况下,我想有更好的解决scheme,然后捕捉exception。

为什么在析构函数中调用dispose(false)?

以下是典型的configuration模式示例: public bool IsDisposed { get; private set; } #region IDisposable Members public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!IsDisposed) { if (disposing) { //perform cleanup here } IsDisposed = true; } } ~MyObject() { Dispose(false); } 我明白什么configuration,但我不明白为什么你想在析构函数中调用dispose(false)? 如果你看这个定义,它什么都不做,那么为什么有人会这样写代码呢? 根本不要从析构函数中调用dispose是不是有意义?

垃圾收集器调用Dispose()吗?

我以为如果你的程序没有,那么GC会调用Dispose,但是你应该在你的程序中调用Dispose()来使清理变得确定。 但是,从我的小testing程序,我没有看到Dispose被调用…. public class Test : IDisposable { static void Main(string[] args) { Test s = new Test(); s = null; GC.Collect(); Console.ReadLine(); } public Test() { Console.WriteLine("Constructor"); } public void Dispose() { Console.WriteLine("Dispose"); } } //输出只是“构造函数”,我不会像我所期望的那样得到“Dispose”。 这是怎么回事? 编辑:是的,我知道我应该调用Dispose() – 我使用一次性对象时遵循标准模式。 我的问题出现了,因为我试图追踪一些代码中的泄漏,这是一个被pipe理的C ++(另一个复杂的层次,可能是另一个线程的主题)。

处理WPF用户控件

我已经创build了一个自定义的WPF用户控件,这个控件可以被第三方使用。 我的控制有一个私人成员是一次性的,我想确保其处理方法将永远被调用一旦包含的窗口/应用程序closures。 但是,UserControl不是一次性的。 我尝试实现IDisposable接口并订阅Unloaded事件,但是在主机应用程序closures时不会调用。 如果可能的话,我不想依赖于我的控制的消费者记得调用一个特定的Dispose方法。 public partial class MyWpfControl : UserControl { SomeDisposableObject x; // where does this code go? void Somewhere() { if (x != null) { x.Dispose(); x = null; } } } 我目前find的唯一解决scheme是订阅Dispatcher的ShutdownStarted事件。 这是一个合理的方法吗? this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;

你如何防止IDisposable传播到所有的类?

从这些简单的课程开始… 比方说,我有一个简单的类,如下所示: class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } 一辆Bus有一个Driver , Driver有两个Shoe ,每个Shoe都有一个Shoelace 。 所有非常愚蠢的。 将一个IDisposable对象添加到鞋带 后来我决定在Shoelace上的一些操作可能是multithreading的,所以我添加一个EventWaitHandle线程来进行通信。 所以Shoelace现在看起来像这样: class Shoelace { private AutoResetEvent […]

如果关联的SqlConnection将被丢弃,是否需要SqlCommand.Dispose()?

我通常使用这样的代码: using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString)) { var command = connection.CreateCommand(); command.CommandText = "…"; connection.Open(); command.ExecuteNonQuery(); } 我的command自动处理吗? 或者不是,我必须把它包装进using块? 是否需要处理SqlCommand ?

完成与处置

为什么有些人通过Dispose方法使用Finalize方法? 在什么情况下你会使用Dispose方法的Finalize方法,反之亦然?

你需要处理的对象,并将其设置为空?

你是否需要处理对象并将它们设置为null,或者当垃圾收集器超出范围时将它们清理干净?