如果我不调用dispose()会发生什么?

5 c# dispose bitmap

    public void screenShot(string path)
    {
        var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
                                        Screen.PrimaryScreen.Bounds.Height,
                                        PixelFormat.Format32bppArgb);

        var gfxScreenshot = Graphics.FromImage(bmpScreenshot);
        gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
                                    Screen.PrimaryScreen.Bounds.Y,
                                    0,
                                    0,
                                    Screen.PrimaryScreen.Bounds.Size,
                                    CopyPixelOperation.SourceCopy);

        bmpScreenshot.Save(path, ImageFormat.Png);
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码捕获我的计算机屏幕.

但今天我发现有一个名为Bitmap.Dispose()的方法.

什么时候调用Dispose()有什么区别?代码运行至关重要吗?

Gyö*_*zeg 13

如果类型实现了IDisposable接口,则应该明确地调用该Dispose方法(显式或通过using块).

如果我不调用dispose()会发生什么?

如果你不这样做,析构函数(终结器)负责释放资源; 但是,它有一些缺点:

  • 不确定性:终结器由GC在专用线程上执行.GC决定何时运行它们.如果对象保留了引用(例如,在主应用程序窗口中),则在退出应用程序之前可能不会执行终结器.
  • 开销:除非终结器被抑制,否则GC有一些待破坏对象的待办事项.
  • 危险:如果终结者抛出异常,则认为是致命的并且会使整个应用程序崩溃.


ken*_*n2k 2

必须打电话Dispose。如果不这样做,就会有一些非托管资源(例如 GDI 对象)不会被清除。这意味着你会出现内存泄漏。

所以是的,请致电Dispose(或者更好,使用using (...) { ... })。

  • @ArthurPark 是的,它们是严格等效的。请参阅 http://stackoverflow.com/questions/10984336/net-using-using-blocks-vs-calling-dispose 也就是说,“using”是最好的,因为它已经实现了 try/finally 模式,因此它确保对象是即使抛出一些异常也已处理。 (3认同)