簡體   English   中英

C#:枚舉的默認值是None還是Unknown?

[英]C#: Should the default value of an enum be None or Unknown?

假設您有一個表示錯誤代碼的枚舉。 將有幾個代碼,每個代碼都有自己的底層int值; 但是,獲取默認值0的枚舉值似乎應該仔細考慮。

在錯誤代碼枚舉的情況下,我可以想到兩個特殊值:無(對於沒有錯誤的情況)和未知(對於沒有現有錯誤代碼的情況,或者甚至當錯誤狀態不能被發現)。

其中一個值似乎應該為0,其他值可能會得到其他類似-1的值。 將None值設置為0或將Unknown值設置為0更合適嗎?

public enum ErrorCode
{
    None = -1,
    Unknown = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
}

public enum ErrorCode
{
    Unknown = -1,
    None = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
}

我的直覺告訴我默認應該是未知,但我很好奇是否有人做了不同的事情。

由於您使用最佳實踐標記了您的問題:在可以使用例外時不要使用錯誤代碼。

在我看來, UnknownNoneErrorCode枚舉的上下文中表示相同的含義。 我的理由是,如果我檢查錯誤代碼而不是因為我已經有錯誤了。

我還認為錯誤代碼枚舉僅在自定義異常或現有異常類型的自定義數據中有用,並且在這兩種情況下,您始終會有錯誤。

絕對不是一個好習慣。 但如果沒有別的辦法......那么我通常會選擇第二種方式:

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

0通過慣例'No Error'很順利,並且-1很好,理解是存在一些錯誤(可能是未知的)。

我想我會不同意其他人的意見。

從“ 這個功能的當前狀態是什么 ”的意義上來看,錯誤代碼沒有任何問題

舉個例子:如果你有一個可選的聯網臨時文件夾,你想要訪問它,並且想要顯示你試圖訪問它的最近時間的結果,你可以將它保存在錯誤代碼中。 也許在狀態欄上,您希望向用戶顯示當前狀態。

對我來說,我會使用None作為默認值為0。 我認為沒有理由讓Unknown成為負面的。 未知是一個完美的錯誤狀態。 你可以把它放在列表的末尾。 在實踐中,我已經做到了

public enum ErrorCode
{
    None = 0,
    InsufficientPermissions,
    ConnectivityError,
    ...
    Unknown,
}

為了回答你的問題,我說無必須是默認的 無意味着:您不知道存在任何錯誤。 未知對我來說意味着:存在一個非常模糊的錯誤,您無法在代碼中對其進行說明。

首先,您不應該有無錯誤代碼。 相反,稱之為“成功”。

現在考慮一下如何檢查錯誤代碼。 大多數人都期望這樣的事情:

if (errorCode != Success)

或者他們使用速記

if (errorCode != 0)

所以你有它。 您的成功代碼為0,您沒有無代碼,未知可以是您想要的任何代碼。

為什么沒有錯誤時根本返回ErrorCode值?

沒有多大意義。 刪除它可以解決您的問題。 你可以將0作為Unkown:

public enum ErrorCode
{
    Unkown = 0,
    InsufficientPermissions,
    ConnectivityError
}

UPDATE

你的評論有點可怕。 你永遠不應該有一個返回一種ErrorCode的方法。 這是非常糟糕的做法。 由於只應在特殊情況下返回ErrorCodes,因此拋出異常是個好主意。

如果需要,可以在自定義Exception中包含一個包含ErrorCode值的字段。

我實際上不同意任何說你應該只使用例外的人。 使用任何使用數據庫的應用程序時,您可能希望存儲系統中數據的狀態。 無論它們是錯誤代碼還是某種狀態,它們最好在數據庫中表示為整數。

使用和處理異常是一項非常重要的技能,應該使用,但我認為將錯誤代碼與這些異常一起使用通常是一個好主意。 它不需要太多額外的資源,並且可以在數據庫連接的應用程序中使用。

我實際上建議按照建議將“無”改為“成功”,但是你將“成功”改為1,並使所有其他錯誤從那里增加。 這背后的原因是因為作為大多數數據庫應用程序的標准,狀態列不可為空,並且通常被跟蹤為整數。 如果您使用成功狀態0,這可能會導致問題,因為如果用戶沒有顯式插入其他內容,默認情況下非可空整數列將設置為0。 這將導致錯誤的狀態/錯誤代碼,並在您的應用程序的未來導致問題。 默認情況下,不僅整數變量在C#中自動初始化為0,導致它自動成功,如果沒有設置初始值,那么枚舉也是如此,這不是你想要的。

同樣從編碼的角度來看,1也可能意味着真實,因此它與成功相得益彰。 有些情況可能並非如此。 在基於Unix的系統中,返回0表示成功/無錯誤,而在其他語言(如c ++)中,0返回是主函數的標准,也表示主函數的成功執行。

ErrorCodes不好。 例外情況好。 但要回答問題:

如果您的枚舉具有“未知”值,則它應該是默認值。

同樣對所有“我不會做出回應”,但如果你堅持,這是我的0.02美元。

ErrorCodes.None毫無意義,因為沒有錯誤。 ErrorCodes.Unknown 嘗試返回可以為空的錯誤代碼:

public ErrorCode? DoFoo()

現在你可以檢查null

var error = DoFoo();
if (error != null)
    // react

還不錯,但至少它允許你在沒有錯誤的情況下返回錯誤代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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