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

本文关键字:表达式 创建 图像 处理 | 更新日期: 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);
  }

不仅不会立即触发垃圾收集器,而且如果对象包含系统资源(如文件),它可能无法正确清除对象。我不确定图像类虽然,但是,如果你的代码必须(有一天)运行在一个紧张的内存,你想要立即清理图像,当你完成它。这就是usingIDisposable的用武之地。

我曾经在这里找到一个关于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。