我应该从C#中的剪贴板上调用Image上的Dispose方法

问题描述 投票:2回答:3

在C#/ .NET中,方法Clipboard.GetData()从剪贴板返回一个对象。

如果返回的对象实现了IDisposable接口(例如Image类的实例),我是否有责任在其上调用Dispose方法(或使用“using”构造)?

GetData的文档没有说明任何特别的内容,因此我假设Clipboard对象正确处理了所有内容。但我的假设可能是错误的。

c# dispose
3个回答
1
投票

如果您使用一些非托管资源(文件句柄,非托管内存等),则应该执行Dispose方法。在这种情况下,您应该在Dispose方法中实现IDisposable并释放资源。

由于您使用返回本机.NET Object的GetData,因此您不必调用Dispose方法。

An example is provided here


2
投票

如果我真的想确定,我会查看使用.NET Reflector的GetData()函数来查看它的作用。我猜它会在应用程序的内存中创建一个图像副本。所以你需要处理它。即使你不需要,多次处理电话也不会受到伤害。


2
投票

像这样的问题很棘手。一般规则是IDisposable对象的所有者负责调用Dispose。当我看到像GetData这样的方法时,我立刻认为它的意图是将IDisposable对象的所有权从被调用者转移给调用者。所以,是的,我认为你是负责任的。现在,另一方面,如果它是一个名为Data的属性,我会假设所有权仍然属于包含对象,因为属性具有提供对被保持实例的访问的一般语义。问题是API开发人员在定义所有者是谁时往往不一致,这就是我说这些问题很棘手的原因。但是,同样,我认为在这种情况下你应该调用Dispose是安全的。

© www.soinside.com 2019 - 2024. All rights reserved.