C# 返回布尔值和字符串值的最佳实践是什么

C# 返回布尔值和字符串值的最佳实践是什么,c#,C#,我创建了一个方法,该方法对运行时由另一个类在Javascript文本中动态生成的XML层次结构执行一些验证 我的方法当前返回True或False,这对使用我的类的任何人都有帮助,但我还想返回更多信息,因为可能有几个原因会抛出错误消息 起初,我想将返回类型从bool更改为一些具有字符串键和布尔值的通用集合类型,我不知道这是否是最好的方法 在这种情况下,最佳做法是什么 在.NET数据类型(例如)的TryParse方法中使用的一种模式在C世界中非常常见,即返回布尔值以表示成功或失败。用户还必须通过引用

我创建了一个方法,该方法对运行时由另一个类在Javascript文本中动态生成的XML层次结构执行一些验证

我的方法当前返回True或False,这对使用我的类的任何人都有帮助,但我还想返回更多信息,因为可能有几个原因会抛出错误消息

起初,我想将返回类型从bool更改为一些具有字符串键和布尔值的通用集合类型,我不知道这是否是最好的方法


在这种情况下,最佳做法是什么

在.NET数据类型(例如)的
TryParse
方法中使用的一种模式在C世界中非常常见,即返回布尔值以表示成功或失败。用户还必须通过引用方法传入一个值,以接收解析后的值

根据您的情况,您的方法签名可能如下所示:

bool DoSomething (out string anInformativeMessage)
然而我个人认为最好的方法是返回一个
结果
Dhinesh在他的回答中描述的类,因为它更灵活,本质上是面向对象的。为了完整性,我添加了这种方法;)

  • 创建自己的results类,方法返回该类,该类包含所需的所有信息。有了这个,您可以在将来更容易地扩展它(如dhinesh的回答)

  • 另一个选项是使用
    Tuple
    对象来存储
    字符串和
    bool
    Tuple
    将是您的返回类型。(仅适用于.NET 4.0及以后版本)

  • 使班级像

    public class ValidationResponse
    {
        public bool Successful { get; set; }
        public string Information { get; set; }
    }
    

    ValidationResponse的return对象

    按照其他答案中的建议,创建一个结果类作为新的返回类型,存在着破坏现有代码的问题

    如果希望/需要避免这种情况,可以引入一个新的
    字符串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);
    }
    

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

  • 返回true,不包含额外信息
  • 返回false,并提供额外信息
  • 然后,您可以将其简化为仅返回字符串。如果没有错误,则返回一个空字符串,该字符串相当于错误代码为零

    string errorMsg = myObject.MyMethod();
    if (errorMsg != String.Empty) {
        Console.Error.WriteLine(errorMsg);
    }
    

    感谢rmx,我只触及了4.0的表面,但很高兴了解Tuple对象。元组的优点是易于使用,但自定义结果类为各个返回值提供了自描述性名称。元组可能适合简单的情况,但我更喜欢一个实际返回类或一个out参数。现在命名元组将是解决选项二的好方法。dhinesh,我喜欢你的建议。它看起来非常干净、可扩展,并且仍然实现了我想要的结果。谢谢但是在函数中实现它会是什么样子呢?我更喜欢这里的out参数,因为消息只由方法写入。使用out还可以保证消息参数被赋值。@gnafoo您说得很对,这正是TryParse实现它的方式。更新的答案。在这种情况下,我可能会提供一个新的扩展方法以及旧的方法。额外过载(例如带有out参数)也可能适用。然后可以重新编写旧方法来调用新方法,并丢弃附加信息。