Kim*_*rly 5 .net c# performance idisposable using-statement
前几天在代码审查期间出现了一个关于 using 块应该多快关闭的问题。一个阵营说,“一旦你完成了对象”;另一个,“在它超出范围之前的某个时间”。
在这个特定的例子中,有一个 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();
}
}
Run Code Online (Sandbox Code Playgroud)
推理:在使用完 SqlCommand 后立即处理它。不要在另一个对象的 using 块中开始可能很长的操作,例如迭代表。
营地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));
}
}
Run Code Online (Sandbox Code Playgroud)
推理:这段代码更简洁。无论如何都保证所有对象都被释放,并且没有一个是真正的资源密集型,因此立即释放任何对象并不重要。
我在营地 2。你在哪里,为什么?
编辑:有几个人指出不需要处理 DataTable(请参阅Corey Sunwold 的回答)并且 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));
}
Run Code Online (Sandbox Code Playgroud)
营地 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));
}
}
Run Code Online (Sandbox Code Playgroud)
我想大多数人都会同意可读性的论点现在大大减少了,这不是我想要问的最好的例子。(一旦我告诉您 SqlConnection 在 GetDataTable() 方法退出之前关闭,并且在此实例中使用的数据没有可测量的性能差异,则尤其如此。)如果我可以这么晚添加我的问题,是否有我是否立即处理该对象确实会产生影响的实例?例如,正如 Gregory Higley 所提到的,像操作系统句柄这样的共享资源。
编辑:(解释我选择的答案)非常感谢所有提供意见、示例和其他有用反馈的人!我们似乎平分秋色,但从每个人的答案中脱颖而出的是“阵营1肯定是对的,但根据对象的不同,阵营2可能还可以”的想法。我的意思是这是对所有类型对象的处理的一般性讨论,但我选择了一个不好的例子来说明它。由于大部分讨论都集中在该特定示例上,因此我选择了能够为我提供有关正在使用的特定对象的重要信息的答案,并证明在做出此类决定时我需要仔细考虑每个对象。(无论如何,对于像我标题中的内容这样含糊不清的问题,很难选择“最佳答案”。)未来的读者也有同样的困境,
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |