c# - ADO.NET 是否过度使用 IDisposable?

标签 c# ado.net using

当 .NET 首次出现时,我是许多提示 .NET 缺乏确定性终结(按不可预测的时间表调用类析构函数)的人之一。微软当时做出的妥协是 using 语句。

虽然不完美,但我认为使用using对于确保及时清理非托管资源很重要。

但是,我正在编写一些 ADO.NET 代码并注意到几乎每个类都实现了 IDisposable。这导致代码看起来像这样。

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
using (SqlCommandBuilder builder = new SqlCommandBuilder(adapter))
using (DataSet dataset = new DataSet())
{
    command.Parameters.AddWithValue("@FirstValue", 2);
    command.Parameters.AddWithValue("@SecondValue", 3);

    adapter.Fill(dataset);

    DataTable table = dataset.Tables[0];
    foreach (DataRow row in table.Rows) // search whole table
    {
        if ((int)row["Id"] == 4)
        {
            row["Value2"] = 12345;
        }
        else if ((int)row["Id"] == 5)
        {
            row.Delete();
        }
    }
    adapter.Update(table);
}

强烈怀疑我不需要所有这些using 语句。但是如果不详细了解每个类的代码,就很难确定我可以省略哪些。结果有点难看,并且有损于我代码中的主要逻辑。

有谁知道为什么所有这些类都需要实现IDisposable? (Microsoft 有很多 code examples online 无需担心处理其中许多对象。)其他开发人员是否为所有这些对象编写了 using 语句?如果没有,您如何决定哪些可以没有?

最佳答案

这里的部分问题是 ADO.NET 是一个抽象提供程序模型。我们不知道在处置方面需要什么特定的实现(特定的 ADO.NET 提供程序)。当然,我们可以合理地假设需要处理连接和事务,但是命令呢?或许。读者?可能,尤其是因为 command-flags 选项之一允许您将连接的生命周期与读取器相关联(因此连接在读取器关闭时关闭,这在逻辑上应该扩展到处置)。

总的来说,我认为它可能没问题。

大多数时候,人们不会手动操作 ADO.NET,任何 ORM 工具(或微型 ORM 工具,例如“Dapper”)都可以为您无需担心。


我会公开承认,在我使用 DataTable 的少数情况下(说真的,那是 2018 年——除了一些小众场景外,这不应该是你表示数据的默认模型) : 我没有处理过。那有点没有意义:)

关于c# - ADO.NET 是否过度使用 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49350749/

相关文章:

c# - File.Move 引起的 System.IO.DirectoryNotFoundException

c# - Excel共享公式展开

javascript - 我想将文本与我的动态复选框匹配

.net - 具有非实体返回类型的实体模型中的函数导入

javascript - 文件未下载 blob 链接

c# - using block 是否使对象保持事件状态?

c# - MongoDB 文本搜索,在 C# 中进行排序

c# - 面对没有主键约束的表时,Dapper 或 ADO.NET

c# - mysql中的tinyint在c#中显示为 bool 值

vb.net - 哪个更快 - 使用 block 或 Try/Catch/Finally