[英]Whats the best practice for returning a Boolean and string value
我創建了一個方法,該方法針對 XML 層次結構執行一些驗證,該 XML 層次結構在運行時由 Javascript 文本中的另一個類動態生成。
我的方法當前返回 True 或 False,這對使用我的 Class 的任何人都有幫助,但我還想返回更多信息信息,因為可能有多種原因會引發 False 消息。
起初我想將返回類型從 bool 更改為具有 String 鍵和 Boolean 值的一些 Generic Collection 類型,我不知道這是否是最好的方法。
在這種情況下,最佳實踐是什么?
制作一個像
public class ValidationResponse
{
public bool Successful { get; set; }
public string Information { get; set; }
}
並返回 ValidationResponse 的對象
在.NET 數據類型的TryParse
方法中使用的一種模式(例如Int32.TryParse )在 C 世界中非常常見,它返回一個布爾值來表示成功或失敗。 用戶還必須通過引用該方法傳入一個值以接收返回的解析值。
對於您的情況,您的方法簽名可能如下所示:
bool DoSomething (out string anInformativeMessage)
但是,我個人認為最好的方法是返回 Dhinesh 在他的回答中描述的Result
類,因為它更靈活,並且本質上是 OO。 為了完整性,我添加了這種方法;)
創建您自己的結果類,您的方法將返回該結果類並包含您需要的所有信息。 有了這個,您將來可以更輕松地擴展它(如 dhinesh 的回答。)
另一種選擇是使用Tuple
對象來存儲string
和bool
: Tuple<string, bool>
將是您的返回類型。 (僅在 .NET 4.0 及更高版本中可用)
Rust std::result
類型對於 C# 也應該類似地工作:
enum Result<T, E> {
Ok(T),
Err(E),
}
你要么:
Ok
類型Err
類型我不知道最佳實踐,但如果您只有以下兩種情況:
然后您可以將其簡化為僅返回一個字符串。 如果沒有錯誤,則返回一個空字符串,相當於錯誤代碼為零。
string errorMsg = myObject.MyMethod();
if (errorMsg != String.Empty) {
Console.Error.WriteLine(errorMsg);
}
如其他答案中所建議的那樣,將 Result 類創建為新的返回類型存在破壞現有代碼的問題。
如果您想/需要避免這種情況,您可以引入一個新的string LastError
屬性,其中包含上次調用您的方法的錯誤消息,並保持方法簽名完整。 你會像這樣使用它
bool success = myObject.MyMethod();
if(!success)
Console.Error.WriteLine(myObject.LastError);
這種方法不太適合多線程環境。
如果預計XML 層次結構將驗證 - 那么我會說這是您應該使用異常的典型示例。 然后該方法只返回 void 並拋出失敗,如下所示:
void validateXMLHierarchy();
並使用
try
{
validateXMLHierarchy();
}
catch (XmlValidationException ex)
{
Console.Error.WriteLine(ex.Message);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.