【发布时间】:2011-03-30 10:21:24
【问题描述】:
在这段代码中使用goto 是否正确?有没有其他选择?
return ExecuteReader(cmd, reader =>
{
List<BEPartnership> partnerhip = null;
//Partnership
if (!((SqlDataReader) reader).HasRows)
goto exit;
partnerhip =
new List<BEPartnership>{new BEPartnership().GetFromReader(reader)};
//Customers
if (!reader.NextResult() && !((SqlDataReader) reader).HasRows)
goto exit;
foreach (BEPartnership p in partnerhip)
p.Partner = new BECustomer().GetFromReader(reader);
//Contracts
if (!reader.NextResult() && !((SqlDataReader) reader).HasRows)
goto exit;
List<BEContractB2B> contracts = new List<BEContractB2B>();
contracts.Add(new BEContractB2B().GetFromReader(reader));
// contracts = new BEContractB2B().GetFromReader2(reader).ToList();
exit:
return partnerhip;
});
【问题讨论】:
-
最佳做法是:不要使用 GOTO!
-
@Steven:过于简单化了
-
在某些情况下使用 goto 非常有用。
-
有些情况下使用goto是很没用的。
-
@Mongus:每次创建循环时,编译器都会将 goto 放入已编译的 IL。 IL 只有三个基本的控制流程:throw、goto 和 return。几乎一切都是goto。结构化编程的重点是选择比 goto 更有意义的控制流,而不是完全避免分支。