gpt4 book ai didi

c# - 如何使用 Dispose() 方法处理某些类型(如 Image)

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:47 26 4
gpt4 key购买 nike

假设我有一个很大的 Image 对象,如果我调用这个对象的 Dispose() 方法,我可以很容易地看到我的应用程序的内存消耗减少了,因为我刚刚从内存中清除了该对象。

但是如果我有自己的类型/类并想处理它的一个实例,比方说,它包含一个 byte[] 数组(我认为这与 Image 类内部有)。我将如何实现 IDisposable,以便在调用 Dispose() 时立即从内存中处理 byte[]。无需等待 GC

如果它是 string 而不是 byte[] 会怎么样?

最佳答案

内存消耗在两种情况下减少:

  1. 垃圾收集器已释放内存,并且
  2. 执行了非托管代码,立即释放了内存。

图像数据示例是第二种情况。图像由操作系统持有,当您处理图像时,操作系统会被调用以释放图像缓冲区。这是操作系统的工作,因为操作系统是在屏幕上渲染图像的系统,而这又取决于硬件和驱动程序。除此之外,图形操作系统针对处理图像数据进行了极其优化 - 难怪它在需要时用于处理图像。

创建自己的一次性类时则完全相反。关于内存占用,执行 dispose 实际上什么都不做。只要有指向已处置类的事件指针,即使垃圾收集也不会减少内存使用量。

只有在分配一些非托管资源时,类才应实现 IDisposable - 文件句柄、图像、套接字(从操作系统的角度来看,它们只是一种文件句柄)等。Dispose 方法应该只释放非托管资源.将字段设置为 null 并做类似的愚蠢事情是没有意义的。

关于c# - 如何使用 Dispose() 方法处理某些类型(如 Image),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com