提问人:Mark Roworth 提问时间:5/10/2022 更新时间:5/10/2022 访问量:82
C# using 语句的意义何在?[复制]
C# What is the point of the using statement? [duplicate]
问:
我不是在谈论对程序集的引用,而是在谈论代码中的 using 语句。
例如,这两者之间有什么区别:
using (DataReader dr = .... )
{
...stuff involving data reader...
}
还有这个:
{
DataReader dr = ...
...stuff involving data reader...
}
当 DataReader 超出范围时,它肯定会被垃圾回收器清理吗?
答:
4赞
user18387401
5/10/2022
#1
语句的要点是,使用该语句创建的对象隐式地释放在块的末尾。在第二个代码片段中,数据读取器永远不会关闭。这是一种确保一次性资源不会保留超过要求的时间的方法,即使引发异常也会被释放。这:using
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);
}
}
评论
0赞
Mark Roworth
5/10/2022
啊,所以 using 语句的作用域强制在作用域末尾处置 DataReader?无论如何,我通常会显式关闭 DataReader,这可能就是为什么它看起来有点多余的原因。如果我以这种方式同时需要多个资源,我可以将多个语句放在 using 语句的括号中,还是需要嵌套多个 using 语句?
0赞
misticos
5/10/2022
您应该使用多个 using 语句,但是您可以使用自 C# 8 以来可用的新 using 声明:它将在作用域的末尾(通常是方法的末尾)处置它。using var obj = new DisposableType();
0赞
user18387401
5/10/2022
@MarkRoworth,我添加了一些代码示例来解决您的问题。
0赞
Charlieface
5/10/2022
@MarkRoworth 但是也处理异常,这正是重点。using
0赞
Mark Roworth
5/10/2022
超级答案。谢谢。现在完全得到它。
0赞
misticos
5/10/2022
#2
这样的语句会自动释放在作用域末尾获得的对象。using
有关更多详细信息,请参阅此文档。
评论