我曾经处理过以下类型的元素:
SqlConnection
SqlDataAdapter
DataSet etc.
但我不确定是否需要处理以下类型的对象:
string[] str = ;
ArrayList etc.
Object of some class
如果需要..请告诉我这样处理是否可以
If(str != null)
{
str = null;
}
请建议我是否有更好的方法来解决这个问题。
不,只有实现IDisposable
接口的对象需要被确定性地处理掉。理想情况下,您应该将它们包装起来,而不是手动using statement
调用该方法:.Dispose
using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT foo FROM bar";
using (var reader = cmd.ExecuteCommand())
{
while (reader.Read())
{
// TODO: consume your resultset
}
}
}
或流:
using (var stream = new MemoryStream())
{
...
}
或文件:
using (var file = File.OpenRead())
{
...
}
或读者:
using (var reader = XmlReader.Create("foo.xml"))
{
...
}
IDisposable
当对象持有对需要释放的非托管对象的引用并且 CLRT 无法自动跟踪和释放这些非托管资源时,该模式在 .NET 中使用。在这种情况下,由开发人员在完成使用它们后立即确定性地处理它们(using statements
如前所示将它们包装起来)。对于没有实现 IDisposable 接口的所有其他对象,您应该将内存管理留给 CLR 和 Grbage 收集器,它们将跟踪它们并在没有更多引用指向它们时自动释放它们持有的内存。作为开发人员,您不必担心。
所以这是经验法则:
当您实例化某个变量时,如果此变量实现 IDisposable 则将其包装在 using 语句中,如果没有,则将其留给垃圾收集器。
null
您正在做str
的不是处置它;null
您只是通过分配一个值来“失去对它的引用” 。这可能会使您的代码未使用该对象,并让 GC 更快地收集其内存。显然,它只对长寿命对象中的字段有意义,因为一旦使用它们的方法返回,局部变量就会使它们的值不使用。
一个例子:如果你有一个对象的字段包含一个字符串数组,并且你确定在对象的生命周期内不需要再次访问这个数组,你可以设置这个数组,null
以便 GC 可以在收集对象本身之前回收数组(及其项)使用的内存。
“正确”处理仅对实现 的对象执行IDisposable
,这意味着分配非内存资源的对象,例如操作系统句柄。