gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:14 25 4
gpt4 key购买 nike

当 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com