C# using 语句有什么意义?

C# What is the point of the using statement?

我说的不是对程序集的引用,而是代码中的 using 语句。

比如这个有什么区别:

using (DataReader dr = .... )
{
    ...stuff involving data reader...
}

还有这个:

{
    DataReader dr = ...

    ...stuff involving data reader...
}

当 DataReader 超出范围时,肯定会被垃圾收集器清理掉吗?

using 语句的要点是您使用该语句创建的对象隐式地放置在块的末尾。在您的第二个代码片段中,数据 reader 永远不会关闭。这是一种确保一次性资源的保留时间不会超过所需时间并且即使抛出异常也会被释放的方法。这个:

using (var obj = new SomeDisposableType())
{
    // use obj here.
}

在功能上等同于:

var obj = new SomeDisposableType();

try
{
    // use obj here.
}
finally
{
    obj.Dispose();
}

您可以像这样对多个一次性对象使用相同的作用域:

using (var obj1 = new SomeDisposableType())
using (var obj2 = new SomeOtherDisposableType())
{
    // use obj1 and obj2 here.
}

如果你需要插入其他代码,你只需要嵌套 using 个块,例如

var table = new DataTable();

using (var connection = new SqlConnection("connection string here"))
using (var command = new SqlCommand("SQL query here", connection))
{
    connection.Open();

    using (var reader = command.ExecuteReader()
    {
        table.Load(reader);
    }
}

这样的using语句会自动处理在范围末尾获得的对象。

您可以参考此documentation了解更多详情。