【发布时间】:2019-10-26 03:06:19
【问题描述】:
我正在尝试进行通用 SQL 调用,这让我想到了一个有趣的问题。我有一个执行 SQL 并返回 SQLDataReader 的方法。
private SqlDataReader ExecuteSql(SqlCommand command)
{
using (var connection = new SqlConnection(ConnectionText, Credentials))
{
command.Connection = connection;
connection.Open();
return command.ExecuteReader();
}
}
调用命令获取阅读器并正确处理返回的数据。然而,我知道读者需要被处理掉,所以我将其附在 using 声明中。
using (SqlDataReader reader = ExecuteSql(command))
{
while (reader.Read())
{
try { ... }
catch(Exception e) { ... }
}
}
我认为 Dispose 应该在 using 语句末尾的 SqlDataReader 上调用,尽管它是在代码中创建的。但是,我无法找到任何具体证实这一点的内容。
概括地说,using 语句能否成功用于在代码中其他地方创建的对象?
作为旁注,我确实意识到如果 SqlDataReader 是在 ExecuteSql 方法中创建为对象而不是直接返回,那么它可能会在 ExecuteSql 中引发异常方法和不被处置。
【问题讨论】:
-
一般对象的特征不依赖于创建它的代码位置。然而,变量并非如此;诸如保证生命周期do 等变量的特征取决于变量的创建位置。