这就够了吗?
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引用,即使没有创建变量 - 资源也不会立即释放?
答案 0 :(得分:2)
除非您专门在其上调用Dispose()
方法(或者它留下using
块),否则不会被处置。因此,在您的情况下,使用第二个using
块将是更安全的选择,以确保您释放非托管资源。
答案 1 :(得分:2)
您应该对实现using
的类型使用IDisposable
语句。否则,在对象完成之前,不会释放资源。
为了使代码更整洁,我喜欢堆叠using
块
using (Graphics g = Graphics.FromImage(image))
using (Image i = newImage.GetThumbnailImage(10, 10, null, new IntPtr()))
{
g.DrawImage(i, 3, 3, 10, 10);
}
答案 2 :(得分:1)
垃圾收集器不仅不会立即触发,而且如果它们保存系统资源(如文件),它可能无法正确清除对象。我不确定Image类,但是,如果你的代码必须(有一天)在紧张的内存上运行,你需要在完成后立即清理图像。这是using
和IDisposable
进来的地方。
我发现了一个关于使用块here的非常好的博客,代码如下:
using (MyClass myClass = GetMyClass())
{
myClass.DoSomething();
}
的行为完全如下:
MyClass myClass = GetMyClass();
try
{
myClass.DoSomething();
}
finally
{
IDisposable disposable = myClass as IDisposable;
if (disposable != null) disposable.Dispose();
}
因此,即使您的代码抛出异常,它也会清理您的Image,如果您自己调用dispose,它将不会造成任何问题。
简而言之:总是使用实现IDisposable的对象,此外,如果代码很复杂,只要不再需要对象就调用Dispose自己 - 并将对象引用设置为null。