我有这个问题:
我无法理解为什么第二个choice就是答案。我的意思是其他方法(KeepAlive和CancelFullGCNotification)会阻止系统调用终结器。
答案 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);
}
}