簡體   English   中英

使用goto的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM