处置不同类型的对象

时间:2012-09-24 13:15:14

标签: c# c#-4.0

我曾经处理过类型的元素:

SqlConnection
SqlDataAdapter
DataSet etc.

但我不确定是否需要处理类型为

的对象
    string[] str = ;
    ArrayList etc.

Object of some class

如果需要..请告诉我是否可以这样处理

If(str != null)
{
  str = null;
}

如果有更好的解决方法,请建议我。

2 个答案:

答案 0 :(得分:4)

不,只有实现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"))
{
    ...
}

当对象持有对需要处理的非托管对象的引用并且CLRT无法自动跟踪和处置这些非托管资源时,在.NET中使用IDisposable模式。在这种情况下,开发人员一旦完成使用它们就会确定性地处理它们(通过将它们包装在using statements中,如前所示)。对于没有实现IDisposable接口的所有其他对象,您应该将内存管理留给CLR和Grbage Collector,它将跟踪它们并在没有更多引用指向它们时自动释放它们所持有的内存。作为开发人员,您不应该担心它。

所以这是经验法则:

  

当你实例化一些变量时,如果这个变量实现了IDisposable,那么将它包装在using语句中,如果没有,则将它保留给垃圾收集器。

答案 1 :(得分:1)

设置为null

你在str做的事情并没有处理它;通过分配null值,您只是“失去对它的引用”。这可能会使代码未使用该对象,并让GC更快地收集其内存。显然,它仅对长寿命对象中的字段有意义,因为局部变量会在使用它们的方法返回时立即使用它们的值。

示例:如果您的对象包含一个包含字符串数组的字段,并且您确定在对象的生命周期内不需要再次访问此数组,则可以将此数组设置为{{ 1}}这样GC就可以在收集对象之前回收数组(及其项目)使用的内存。

处置

“正确”处理仅在实现IDisposable的对象上执行,这意味着分配非内存资源的对象,例如操作系统句柄。