[英]Best practice for using goto
在這段代碼中使用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 exit;
return null;
或return partnerhip;
如果您希望返回當前填充的列表。 (我認為合作伙伴關系是一個很酷的合作伙伴?)
我會說不。
我從2001年開始用C#編程,從未使用過goto!
如果您想在代碼中出現“短路”退出,為什么不替換
goto exit:
同
return partnership
在我看來, goto
和“最佳實踐”是相互排斥的(並且可能/希望也是大多數其他人的)。 需要goto
表示錯誤的代碼設計。 在你的情況下,解決方案似乎很簡單:我認為你只需要通過return partnerhip
替換goto exit
並刪除標簽exit:
. (它應該是“伙伴關系”而不是“伙伴關系”嗎?)
你最后在做的是從讀者那里加載合同。 如果使用簡單的if語句明確表達此意圖,則會更好。
將結束更改為:
if (reader.NextResult() || ((SqlDataReader) reader).HasRows)
{
List<BEContractB2B> contracts = new List<BEContractB2B>();
contracts.Add(new BEContractB2B().GetFromReader(reader));
}
return partnerhip;
雖然看起來你只是忽略了合同清單......它沒有做任何事情。 除非創建一個新的BEContractB2B類有一些全局副作用(壞消息),你可以完全擺脫它...
改變第一個轉到
if (!((SqlDataReader) reader).HasRows)
return null;
既然這就是你正在做的事情,你應該明白你將返回null。
我發現以下情況,當goto可能有點用處: 何時使用Goto進行C語言編程時 。 但是“ 從不使用GOTO ”是我在大學學到的第一件事,因此我從未使用它(至少不是在C,C ++,C#,Java,......)。
GOTO的最大問題是,如果你閱讀了一些方法,你就看不出它可以被調用的地方。 例如:
int a = 1;
division:
int b = 4 / a;
......聽起來不錯 但是如果在分割塊之后存在以下GOTO,則會寫出0分割崩潰:
int a = 1;
division:
int b = 4 / a;
// ... hundreds of lines ...
a = 0;
goto division;
...如果在分區塊之前有GOTO,則為null-exception崩潰:
goto division;
// ... hundreds of lines ...
int a = 1;
division:
int b = 4 / a;
......這只是一個例子,GOTO引發了更多有爭議的情況。 所以請忘記GOTO,人們(包括你)在閱讀代碼時會更開心。
使用“返回伙伴關系;” 而不是你的goto。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.