在这个具体的例子中,有一个需要被处理的 DataTable 和 SqlCommand 对象。我们需要在单个语句中引用两者,并且需要迭代 DataTable。
第一派:
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块内开始可能会很长的操作,比如迭代表。
阵营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));
}
}
推理:这段代码更加干净。无论如何,所有对象都有保证被处理,并且没有真正的资源密集型,因此立即处理任何对象并不重要。
我属于第二派。你呢?为什么?
编辑:一些人指出DataTable不需要被处理(参见Corey Sunwold's answer),而且第一派最初的示例比它实际需要的更糟糕。以下是一些修改后的示例,也考虑到大多数情况下,我必须在SqlCommand上设置一些属性。如果有人看到或想到支持任何一方的更好的例子,请分享。
第一派,版本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));
}
}
我认为大多数人都会同意,可读性的论点现在已经大大降低,而这并不是我试图询问的最好的例子。(特别是一旦我告诉你,在GetDataTable()方法退出之前SqlConnection已关闭,并且对于此实例中使用的数据没有可衡量的性能差异。)如果我可以晚些时候补充我的问题,是否有情况下立即处理对象确实会有所区别?例如,像Gregory Higley提到的共享资源,如操作系统句柄。
编辑:(解释我的答案选择)非常感谢所有提供意见、示例和其他有用反馈的人!我们似乎分歧差不多,但所有人的回答都强调了一个观点,“阵营1绝对是正确的,但根据物品的不同,阵营2也许可以接受”。我本意是讨论所有类型物品的处理方式,但我选择了一个不好的例子来说明。由于讨论的大部分重点放在了那个特定的例子上,我选择了那个给我提供了关于具体使用对象重要信息,并证明我需要仔细考虑每个对象的决策的答案。 (对于我的标题这样模糊的问题,选择“最佳答案”将很困难。)未来遇到相同困境的读者,请看下面的所有答案,因为它们中的许多都提出了有趣的观点。