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

C# 是否立即处理在表达式中创建的图像?,c#,dispose,using,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 (I

这是否足够:

    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
块将是更安全的选择,以确保释放非托管资源。

对于实现
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);
  }

垃圾收集器不仅不会立即触发,而且如果对象包含系统资源(如文件),它可能无法正确清除这些对象。虽然我不确定Image类,但是,如果您的代码(有一天)必须在内存紧张的情况下运行,您希望在使用完后立即清理图像。这就是
使用
IDisposable
的用武之地

有一次我发现了一个关于使用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的对象一起使用。此外,如果代码复杂,请在不再需要对象时调用Dispose,并将对象引用设置为null