在表达式中创建的图像是否立即处理?

时间:2011-11-15 19:24:22

标签: c# dispose using

这就够了吗?

    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引用,即使没有创建变量 - 资源也不会立即释放?

3 个答案:

答案 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类,但是,如果你的代码必须(有一天)在紧张的内存上运行,你需要在完成后立即清理图像。这是usingIDisposable进来的地方。

我发现了一个关于使用块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。