c#应用程序中的垃圾收集方法

时间:2015-05-12 21:37:35

标签: c# .net memory-management garbage-collection

我有这个问题:

question

我无法理解为什么第二个choice就是答案。我的意思是其他方法(KeepAliveCancelFullGCNotification)会阻止系统调用终结器。

  1. 这四种方法有什么区别?
  2. 在哪些情况下,我们必须使用它?

3 个答案:

答案 0 :(得分:5)

KeepAlive只会 延迟 在类上调用终结器(通过延长对象的寿命并且没有资格进行最终确定)和{{1}与完成无关。

只有Public Function csvToDatatable_2(ByVal filename As String, ByVal separator As String) Dim dt As New System.Data.DataTable Dim firstLine As Boolean = True If IO.File.Exists(filename) Then Using sr As New StreamReader(filename) While Not sr.EndOfStream If firstLine Then firstLine = False Dim cols = sr.ReadLine.Split(separator) For Each col In cols dt.Columns.Add(New DataColumn(col, GetType(String))) Next Else Dim data() As String = sr.Readline.Split(separator) dt.Rows.Add(data.ToArray) End If End While End Using End If Return dt End Function 阻止 终结器才能在课堂上运行。

答案 1 :(得分:3)

只有在编写终结器后才需要使用SuppressFinalizer。大多数时候你不需要压制。无论如何,B是正确答案,是防止析构函数/终结方法被调用的唯一方法。

答案 2 :(得分:1)

更重要的是......应该很少使用终结器并自行延迟垃圾收集。

它可以清理非托管资源,这是通常使用的模式:

public class SomeClass : IDisposable
{
    private bool disposed;

    //disposing is true if you're disposing managed resources
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                //Dispose managed resources
            }
            //Dispose unmanaged resources
            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~SomeClass()
    {
        Dispose(false);
    }
}