【发布时间】:2017-02-14 17:57:39
【问题描述】:
当我的表单引用图像和图标资源时,我有点困惑是否要处理它们。具体来说,如果我从设计时资源中引用图像/图标或在运行时加载图像,行为是否会有所不同。 (.Net4, VS2015, C#)
显然,如果您在设计时将表单的 Icon 属性设置为 Resource,则在关闭表单时您不会显式地Dispose() 。但是如果你这样设置呢:
this.Icon = Resources.my_default_icon;
您是否必须在关闭该表单时处理 this.Icon?
同样,如果我有一个仅用于“品牌化”的迷你类,并且有一个静态 Icon 对象在运行时加载(可能来自文件,可能只是引用嵌入式资源)怎么办?我应该在静态Icon 的吸气剂中使用复制构造函数吗?还是可以将其设为公共静态 Icon 并允许我的所有表单在其 _Shown() 事件中具有以下单行符?
this.Icon = MyBrandingClass.formIcon;
不确定它是否有很大不同,我看到了一些关于在运行时设置图片框的图像并处理图像的参考,但是你会处理嵌入的资源图像吗?如果我传递了对我的品牌形象的引用,我可以/应该省略 dispose 吗?或者我应该在 getter 中使用复制构造函数来返回一个新的 Image 对象,然后在处理完表单后总是将其丢弃?
【问题讨论】:
-
几乎普遍适用于 .NET 的 GC 的经验法则是您只处置您创建的对象。如果您没有创建该对象,那么您不应该处置它。您的嵌入式资源也是如此。你没有创建对象,所以你不应该处理它们。
-
我想你已经知道答案了。想象一下,Form.Dispose() 方法确实释放了 Icon 对象,这对您的徽标来说不是一个令人讨厌的惊喜吗?正常的所有权规则适用,Form 类没有创建图标对象,因此也无法释放它。几乎没有人编写代码来处理它。这么小的对象无关紧要,GC 会处理它。而且,如果您无法跟踪使用它的表单数量,那么您当然不会打扰。如果它是一个巨大的喇叭位图,会变得更加不确定,然后你开始喜欢它的 Clone() 方法。