繁体   English   中英

返回布尔值和字符串值的最佳做法是什么

[英]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。 为了完整性,我添加了这种方法;)

  1. 创建您自己的结果类,您的方法将返回该结果类并包含您需要的所有信息。 有了这个,您将来可以更轻松地扩展它(如 dhinesh 的回答。)

  2. 另一种选择是使用Tuple对象来存储stringboolTuple<string, bool>将是您的返回类型。 (仅在 .NET 4.0 及更高版本中可用)

Rust std::result类型对于 C# 也应该类似地工作:

enum Result<T, E> {
   Ok(T),
   Err(E),
}

你要么:

  1. 返回带有值的Ok类型
  2. 或带有错误消息的Err类型

老答案:

我不知道最佳实践,但如果您只有以下两种情况:

  1. 返回真,没有额外的信息
  2. 返回 false,带有额外信息

然后您可以将其简化为仅返回一个字符串。 如果没有错误,则返回一个空字符串,相当于错误代码为零。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM