gpt4 book ai didi

c# - 我应该多快关闭 using block ?

转载 作者:太空狗 更新时间:2023-10-30 01:26:11 26 4
gpt4 key购买 nike

前几天在代码审查期间提出了一个问题,即应该多快关闭一个 using block 。一个营地说,“一旦你完成了这个对象”;另一个,“在它超出范围之前的某个时间”。

在这个具体的例子中,有一个DataTable和一个SqlCommand对象要被释放。我们需要在单个语句中引用两者,并且需要迭代 DataTable。

营地 1:

List<MyObject> listToReturn = new List<MyObject>();
DataTable dt = null;
try
{
using (InHouseDataAdapter inHouseDataAdapter = new InHouseDataAdapter())
using (SqlCommand cmd = new SqlCommand())
{
dt = inHouseDataAdapter.GetDataTable(cmd);
}

foreach (DataRow dr in dt.Rows)
{
listToReturn.Add(new MyObject(dr));
}
}
finally
{
if (dt != null)
{
dt.Dispose();
}
}

推理:使用完 SqlCommand 后立即处理它。不要在另一个对象的 using block 中开始可能很长的操作,例如迭代表。

营地 2:

List<MyObject> listToReturn = new List<MyObject>();
using (InHouseDataAdapter inHouseDataAdapter = new InHouseDataAdapter())
using (SqlCommand cmd = new SqlCommand())
using (DataTable dt = inHouseDataAdapter.GetDataTable(cmd))
{
foreach (DataRow dr in dt.Rows)
{
listToReturn.Add(new MyObject(dr));
}
}

推理:这段代码更简洁。无论如何都会保证所有对象都被释放,而且没有一个是真正的资源密集型对象,因此立即释放任何对象并不重要。

我在 2 号营地。你在哪里,为什么?

编辑: 一些人指出不需要处理 DataTable(请参阅 Corey Sunwold's answer)并且 Camp 1 的原始示例比需要的更丑陋。下面是一些经过修改的示例,这些示例还考虑到大多数时候,我必须在 SqlCommand 上设置一些属性。如果有人看到或能想到更好的例子来支持这两种立场,请分享。

训练营 1,版本 2:

DataTable dt = null;
using (InHouseDataAdapter inHouseDataAdapter = new InHouseDataAdapter(_connectionString))
using (SqlCommand cmd = new SqlCommand("up_my_proc"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@class_id", 27);
dt = inHouseDataAdapter.GetDataTable(cmd);
}

foreach (DataRow dr in dt.Rows)
{
listToReturn.Add(new MyObject(dr));
}

训练营 2,版本 2:

using (InHouseDataAdapter inHouseDataAdapter = new InHouseDataAdapter(_connectionString))
using (SqlCommand cmd = new SqlCommand("up_my_proc"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@class_id", 27);
DataTable dt = inHouseDataAdapter.GetDataTable(cmd);
foreach (DataRow dr in dt.Rows)
{
listToReturn.Add(new MyObject(dr));
}
}

我想大多数人都会同意可读性的争论现在大大减少了,这不是我要问的最好的例子。 (一旦我告诉您 SqlConnection 在 GetDataTable() 方法退出之前关闭,并且此实例中使用的数据没有可测量的性能差异,就尤其如此。)如果我现在可以添加到我的问题中,是否有在哪些情况下我是否立即处置该对象确实有所不同?例如,as Gregory Higley mentioned ,一种共享资源,如操作系统句柄。

编辑:(解释我选择的答案)非常感谢所有提供意见、示例和其他有用反馈的人!我们似乎平分秋色,但从每个人的回答中突出的是“阵营 1 肯定是对的,但根据对象,阵营 2 可能还可以”。我的意思是这是对所有类型对象的处理的一般性讨论,但我选择了一个不好的例子来说明它。由于大部分讨论都集中在那个特定的例子上,我选择的答案能给我关于正在使用的特定对象的重要信息,并证明在做出这种决定时我需要仔细考虑每个对象。 (无论如何,要为像我的标题中这样模糊的问题选择一个“最佳答案”是很困难的。) future 有同样困境的读者,请查看下面的所有答案,因为他们中的许多人提出了有趣的观点。

最佳答案

我大部分同意营地 1。但是,您应该注意它可能是 not necessary to dispose a DataTable .

关于c# - 我应该多快关闭 using block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5494809/

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