如何为类编写析构函数

本文关键字:析构函数 | 更新日期: 2023-09-27 17:50:05

我有以下类:

public class test
{
       public int datacapturecount { get; set; }
       public int sno { get; set; }
       public string name { get; set; }
       public string sourceaddr { get; set; }
       public string destaddr { get; set; }
       public string Bssid { get; set; }
       public string packetsubtype { get; set; }
       public UInt16 datarate { get; set; }
       public SByte signal { get; set; }
       public UInt32 channel { get; set; }
       public UInt32 size { get; set; }
}

我正在使用这个类,同时添加行到wpf datagrid在一个无限循环:

for(I=0; ; I++)
{
    datagrid.Items.Add(new test() {
        datacapturecount = 0, 
        sno = I,
        name = "ssss",
        sourceaddr = "44545454"
    }); 
}

这里的类测试创建了多个实例并导致内存泄漏。如何避免这种情况?如何为上述类编写析构函数,以便我可以强制GC在将行添加到数据网格后立即收集内存?

如何为类编写析构函数

没有内存泄漏。每个类实例都被添加到datagrid.Items,所以当您一直保持对datagrid.Items的引用时,对test实例的引用必须保留在内存中。因为在添加项时存在无限循环,所以代码将一直运行,直到内存耗尽。

添加析构函数或IDisposible对该类没有影响。您需要管理添加到datagrid.Items的项目数量。

没有内存泄漏。简单地说,您正在尝试将无限数量的行添加到DataGrid。你迟早会耗尽内存。

for(I=0; ; I++)

没有结束for循环的检查:

for(I=0; I < 100; I++)

这将尝试添加100行

正如前面的答案所提到的,您的代码不会导致任何内存泄漏。

如果你仍然想在你的类中添加析构函数(出于其他原因),你可以通过在你的类中添加以下代码来实现。

~test()
{
    // Do whatever cleanup you find necessary.
}

如何为类添加析构函数

何时实现IDispose

你应该实现IDisposable模式,如果你有任何类变量已经实现了IDispose接口。简单地说,如果你有任何类变量有Dispose方法,你应该实现IDispose接口并Dispose所有的一次性对象。

何时实现Finalizer (Destructor)

只有当你的类中有非托管资源时,你才应该实现终结器(或析构器)。请参阅上述msdn页面了解更多详细信息。如果没有任何非托管资源,就不应该实现终结器。因为,使用终结器会导致这些实例在内存中停留更长时间。实际上,它将在内存中停留两个GC周期。第一个GC周期将其添加到CLR结束队列中,第二个GC周期将实际处理它。这就是为什么当您手动调用Dispose方法时,要在该方法中抑制结束。

返回你的代码

显然,在测试类中没有任何可用的Disposable类变量。因此,您根本不需要在这个Test类中实现IDisposable。无限循环可能是您担心的原因。