我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
在方法中将自定义对象设置为null(Nothing在VB.NET中)是否有意义Dispose()?这可以防止内存泄漏或无用吗?!
让我们考虑两个例子:
public class Foo : IDisposable
{
private Bar bar; // standard custom .NET object
public Foo(Bar bar) {
this.bar = bar;
}
public void Dispose() {
bar = null; // any sense?
}
}
public class Foo : RichTextBox
{
// this could be also: GDI+, TCP socket, SQl Connection, other "heavy" object
private Bitmap backImage;
public Foo(Bitmap backImage) {
this.backImage = backImage;
}
protected override void Dispose(bool disposing) {
if (disposing) …Run Code Online (Sandbox Code Playgroud) 我有一个像下面这样的功能:
Public Function testFunction(ByVal input_string As String) As String
Dim s As New StringBuilder()
Dim c As Char
For i As Integer = 0 To input_string.Length - 1
c = input_string.Chars(i)
s.Append(c)
Next
Return s.ToString
End Function
Run Code Online (Sandbox Code Playgroud)
但我想知道是否最好明确销毁任何对象,如下所示:
Public Function testFunction(ByVal input_string As String) As String
Dim s As New StringBuilder()
Dim c As Char
For i As Integer = 0 To input_string.Length - 1
c = input_string.Chars(i)
s.Append(c)
Next
Dim t As String = s.ToString
s = Nothing
Return …Run Code Online (Sandbox Code Playgroud)