C# manual-Dispose -of -an -IDisposable 语义
C# manual-Dispose -of -an -IDisposable semantics
我想知道在下面的给定场景中是否需要执行任何手动位图处理操作。假设我的 WinForm 有两个全局位图,A 和 B。假设我想对它们各自的图像执行一些 transform/blend 操作,但想对副本执行此操作。我的目标是像这样调用转换函数(Bitmap Transform(Bitmap first, Bitmap second)
):
var newB = Transform( ( Bitmap )A.Clone(), ( Bitmap )B.Clone() ).
在 Transform
中完成后,我是否会处理转换中的 A
和 B
副本?我是否在调用之前复制然后在 return 之后处理?由于这些引用在 Transform
return 之后完全丢失,我可以信任 GC 吗?
-EDIT_ 添加来自 BELOW_-
的评论
至于潜在的重复,我看到了 post,但它缺少任何使用调用时创建的参数的示例。我想知道传递的对象在调用范围内是否没有家,是否有处置方式,是否有必要进行处置,或者是否必须提供一个家才能正确处理处置。从我在这里收集的内容来看,似乎不建议创建无法在创建范围内处理它们的一次性对象。 –
此外,我可以确认 Martin 的解决方案是有效的,尽管在转换主体中进行克隆被证明是最有组织和最干净的。只需要处理其中一个克隆,因为我使用了一个作为 return 中引用的对象。最后,克隆是必要的,因为如果图像处于读取位锁状态,任何图片框图像刷新都会抛出异常,这对于 transform.thanks 帮助大家
是必要的
垃圾收集器不会对实现 IDisposable
的对象自动调用 Dispose
。只有当他们的 类 覆盖了终结器并确保 Dispose
被调用时才会发生这种情况。见 documentation here.
通常最好的方法是在 using
块中创建一次性对象的实例。
using ( var bitmapA = ( Bitmap )A.Clone() )
using ( var bitmapB = ( Bitmap )B.Clone() )
{
var newB = Transform( bitmapA, bitmapB );
}
我想知道在下面的给定场景中是否需要执行任何手动位图处理操作。假设我的 WinForm 有两个全局位图,A 和 B。假设我想对它们各自的图像执行一些 transform/blend 操作,但想对副本执行此操作。我的目标是像这样调用转换函数(Bitmap Transform(Bitmap first, Bitmap second)
):
var newB = Transform( ( Bitmap )A.Clone(), ( Bitmap )B.Clone() ).
在 Transform
中完成后,我是否会处理转换中的 A
和 B
副本?我是否在调用之前复制然后在 return 之后处理?由于这些引用在 Transform
return 之后完全丢失,我可以信任 GC 吗?
-EDIT_ 添加来自 BELOW_-
的评论至于潜在的重复,我看到了 post,但它缺少任何使用调用时创建的参数的示例。我想知道传递的对象在调用范围内是否没有家,是否有处置方式,是否有必要进行处置,或者是否必须提供一个家才能正确处理处置。从我在这里收集的内容来看,似乎不建议创建无法在创建范围内处理它们的一次性对象。 –
此外,我可以确认 Martin 的解决方案是有效的,尽管在转换主体中进行克隆被证明是最有组织和最干净的。只需要处理其中一个克隆,因为我使用了一个作为 return 中引用的对象。最后,克隆是必要的,因为如果图像处于读取位锁状态,任何图片框图像刷新都会抛出异常,这对于 transform.thanks 帮助大家
是必要的垃圾收集器不会对实现 IDisposable
的对象自动调用 Dispose
。只有当他们的 类 覆盖了终结器并确保 Dispose
被调用时才会发生这种情况。见 documentation here.
通常最好的方法是在 using
块中创建一次性对象的实例。
using ( var bitmapA = ( Bitmap )A.Clone() )
using ( var bitmapB = ( Bitmap )B.Clone() )
{
var newB = Transform( bitmapA, bitmapB );
}