2

我在处理和完成之间变得紧张。这是我的示例代码:

public class Car:IDisposable
    {
        public string name;
        public Car()
        {
            name = "My Car";
        }
        public void Dispose()
        {
            Console.WriteLine("This object has been disposed");
        }
    }
public static void Main()
        {
            Car anotherCar;
            using (var car = new Car())
            {
                anotherCar = car;
                Console.WriteLine("Before dispose. Name is: "+anotherCar.name);
            }

            Console.WriteLine("After dispose. Name is: "+anotherCar.name);

        }

结果是:

Before dispose. Name is My Car
This object has been disposed
After dispose. Name is My Car

我的问题是:因为 C# 会在 之后自动处理对象using{},所以我认为在“处理后”行。anotherCar.name必须为 NULL。为什么它仍然是“我的车”?

我的另一个问题是:我的书说你不应该GC.Collect()出于某种原因使用,其中之一就是性能。那么,谁处置对象?如果那也是垃圾收集器,那么我认为dipose()也有相同的性能问题finalizer()

谢谢 :)

4

3 回答 3

6

我认为您误解了 Dispose 的实际作用。它不会破坏您的对象、将任何内容设置为 null 或以其他方式执行任何类型的魔法。当您使用 using 语句时,这只是保证将调用 Dispose。您在 Dispose 方法中所做的决定了对象的行为。不是语言或 .NET 框架。

于 2012-05-26T19:47:01.820 回答
4

如果再次查看代码,您会立即意识到,简单地将 Dispose() 方法放在一个类上并实现 IDisposable 并没有添加任何幕后魔法,它只是一个普通方法,增加了调用它的便利性using 语句的结尾。

通常在 Dispose 方法中,您应该注意清除您想要自己释放的任何(非托管)资源,例如关闭数据库连接或打开以读取/保存的文件......

Microsoft 有一个关于正确实现 IDisposable的很好的帮助页面。

于 2012-05-26T19:47:25.040 回答
3

.net 中的对象通常是类型引用以及该类型所需的公共和私有字段的组合(有一些特殊情况,如数组和字符串)。一旦创建,.net 中的对象将继续存在,只要存在对它的某种形式的引用。一旦不再有对对象的任何引用,if 将有效地停止存在;它占用的任何内存都将只是未使用的内存,可以在下一次垃圾收集时重用。

的目的Dispose不是摧毁一个对象,而是让一个对象在它消失之前对它自身之外的事物执行必要的动作。举个简单的例子,假设一个对象请求远程服务器授予它对文件的独占访问权限;服务器提供一个令牌,并承诺只授予提供该令牌的代码访问权限。如果对象只是简单地消失,外部服务器将保持文件锁定,以独占使用持有不再存在的令牌的代码。换句话说,该文件将永远(*)任何人都无法使用。向请求令牌的对象添加Dispose方法将允许对象向服务器发送“好的——我已完成文件 XYZ1493”消息,从而使该文件可用于其他实体。

Note that the Dispose method doesn't actually destroy the file object. It may prompt the object to erase some of the data stored in its fields, but the object will continue to exist as long as any reference to it exists, and will cease to exist thereafter. There are some cases where calling Dispose on an object may hasten the demise of the object itself, by asking other outside objects which hold references to it to destroy those references. Even in those cases, however, the purpose of Dispose is to allow objects to issue requests to other things.

于 2012-05-27T17:16:43.157 回答