用Image.FromFile打开用于图像的VB.NET垃圾收集

时间:2014-09-09 08:10:46

标签: .net vb.net garbage-collection

请考虑以下代码:

Public Class MyOwnClass
    Public Property MyString As String

    Public Property MyImage As Image
End Class

Dim MyList As New List(Of MyOwnClass)

Public Sub Add()
    MyList.Add(New MyOwnClass With {.MyString = "MyString", .MyImage = Image.FromFile("C:\MyPath\MyPic.png")})
End Sub

Public Sub Clear()
    MyList = Nothing
End Sub

我定义一个带有Image的引用的类,我的类的列表。

第一个Sub将一个项目添加到列表中,我的问题是关于第二个Sub: 是否使列表的引用无效,以使垃圾收集器消灭我的类实例和引用的图像?

他们看起来都是我的管理资源,所以我的答案是“当然是!”,但不能确定。

谢谢。

1 个答案:

答案 0 :(得分:0)

不,图像不是托管资源。它实现了IDisposable,所以你需要处理它,否则你将在程序中稍后得到GDI +错误。

因为Image是IDisposable,所以你需要创建自己的类IDisposable。使用常用模式将Finalizer添加到MyOwnClass,以确保正确处理图像。我不做VB,但这是C#中的一般想法

public class MyOwnClass : IDisposable
{
    public Image MyImage {get;set;}
    private bool disposed = false;
    private bool disposing = false;
    ~MyOwnClass()
    {
        this.dispose();
    }
    private void dispose()
    {
        if(! disposed && ! disposing)
        {
            disposing = true;
            if(this.MyImage != null) this.MyImage.Dispose();
            this.MyImage = null;
        }
        disposed = true;

    }
    public void Dispose()
    {
        GC.SupressFinalizer(this);
        this.dispose();
    }
}