CodeGo.net>的ADO.NET IDisposable是否落伍?

当.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,而不必担心要处理这些对象.)其他开发人员是否正在为所有这些对象编写语句?而且,如果没有,您如何确定哪些可以没有?

最佳答案
问题的一部分是ADO.NET是抽象提供程序模型.我们不知道在处理方面需要什么特定的实现(特定的ADO.NET提供程序).当然,我们可以合理地假设需要处理连接和事务,但是命令呢?也许.读者?可能不是特别重要,因为其中一个命令标志选项使您可以将连接的生存期与读取器相关联(因此,连接在读取器打开时会关闭,从逻辑上讲应该扩展为废弃).

所以总的来说,我认为可能还不错.

在大多数情况下,人们不会手工搞乱ADO.NET,并且任何ORM工具(或微型ORM工具,例如“ Dapper”)都将为您提供正确的选择,而您不必担心它.

我会公开承认在几次使用DataTable的情况下(严重的是,这是2018年-除非是一些特殊情况,否则它不应该是表示数据的默认模型):我没有处理它们.那有点没有道理:)

转载注明原文:CodeGo.net>的ADO.NET IDisposable是否落伍? - 代码日志