English 中文(简体)
C# 弃置:何时处置,何人处置
原标题:C# Dispose : when dispose and who dispose it
  • 时间:2012-05-26 19:40:37
  •  标签:
  • c#
  • dispose

我胆敢在处置和最后敲定之间发神经。

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# 会在 < code> using {%/ code> 后自动处置对象, 所以在“ enfortending” 线上, anotherCar. name 必须是 NULL。 为什么它仍然是“ my car ”?

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

谢谢:)

最佳回答

我认为您误解了“ 放弃” 的实际作用。 它不会破坏您的物体, 设置任何无效的物体, 或者执行任何一种魔法。 当你使用使用该语句时, 只需保证“ 放弃” 将被称作“ 放弃 ” 。 您在“ 放弃” 方法中所做的就是决定您对象的行为。 语言或. NET 框架不是这个语言或. NET 框架 。

问题回答

如果你再看一遍代码,你就会立即意识到,简单地在课堂上放一个投放()方法,然后实施“无法处置”方法,不会在幕后增加任何魔术,这只是一种正常方法,加上附加的方便,在使用语句的结尾处会调用它。

一般而言,在丢弃方法中,您应该注意清除您希望自己释放的任何(未管理的)资源,例如关闭 db 连接或打开供阅读/保存的文件...

微软有一个很好的" "http://msdn.microsoft.com/ en-us/library/ms244737%28v=vs. 80%29.aspx" rel=“nofollow”>help page 有关执行无法正确执行的网页 。

. net 中的对象一般是类型引用和该类型所需的公共和私人字段(有数个特殊案例,如阵列和字符串)的组合。一旦创建,只要存在某种形式的引用,. net 中的对象将继续存在。 一旦不再提及对象, 如果该对象实际上将不复存在; 它所占用的任何记忆都将只是未使用的内存, 有资格在下一个垃圾收藏中重新使用 。

dispose 的目的不是摧毁一个物体,而是允许一个物体在消失之前以 things外部自己 进行必要行动。简单举例来说,假设一个物体要求远程服务器允许它独家访问一个文件;服务器提供象征性,承诺只允许访问该标记的代码。如果对象只是消失,外部服务器会留下文件,专用于持有不再存在的标牌的代码。换句话说,文件将永远(*) 任何人无法使用。在请求的标牌对象上添加一个 dispose 方法,将使该对象能够发送“用文件 XYZ1493 完成的Ok-IM” 信息,从而使该文件可供其他实体使用。

请注意“ 丢弃” 方法实际上并没有销毁文件对象。 它可能会促使目标去掉其字段中储存的一些数据, 但只要存在任何提及它的地方, 该对象就会继续存在, 并且此后将不复存在。 有些情况下, 调用“ 丢弃” 方法可能会加速物体本身的消亡, 要求其他持有提及它的地方的外部物体销毁这些引用。 但是, 即便在这些情况下, 丢弃的目的, 也是为了允许物体向其它东西发出请求 。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...