是在立即处理的表达式中创建的图像
本文关键字:表达式 创建 图像 处理 | 更新日期: 2023-09-27 18:14:59
这样够了吗:
using (Graphics g = Graphics.FromImage(image))
{
g.DrawImage(newImage.GetThumbnailImage(10, 10, null, new IntPtr()), 3, 3, 10, 10);
}
或者我应该使用:
using (Graphics g = Graphics.FromImage(image))
{
using (Image i = newImage.GetThumbnailImage(10, 10, null, new IntPtr()))
{
g.DrawImage(i, 3, 3, 10, 10);
}
}
编辑:有人可以添加一些MS参考,即使没有创建变量-资源不会立即被释放?
它不会被处理,除非你特别在它上面调用Dispose()
方法(或者它留下一个using
块)。因此,在您的情况下,使用第二个using
块将是更安全的选择,以确保您释放非托管资源。
对于实现IDisposable
的类型,应该使用using
语句。否则,在对象结束之前,资源不会被释放。
为了使代码更整洁,我喜欢堆叠using
块
using (Graphics g = Graphics.FromImage(image))
using (Image i = newImage.GetThumbnailImage(10, 10, null, new IntPtr()))
{
g.DrawImage(i, 3, 3, 10, 10);
}
不仅不会立即触发垃圾收集器,而且如果对象包含系统资源(如文件),它可能无法正确清除对象。我不确定图像类虽然,但是,如果你的代码必须(有一天)运行在一个紧张的内存,你想要立即清理图像,当你完成它。这就是using
和IDisposable
的用武之地。
我曾经在这里找到一个关于Using block的非常好的博客,代码如下:
using (MyClass myClass = GetMyClass())
{
myClass.DoSomething();
}
将完全像这样:
MyClass myClass = GetMyClass();
try
{
myClass.DoSomething();
}
finally
{
IDisposable disposable = myClass as IDisposable;
if (disposable != null) disposable.Dispose();
}
所以即使你的代码抛出和异常,它也会清理你的图像,如果你自己调用dispose,它也不会造成任何问题。
简而言之:始终对实现IDisposable的对象使用using,此外,如果代码很复杂,在不再需要该对象时自己调用Dispose,并将对象引用设置为null。