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

时间:2011-05-11 11:44:16

标签: c#

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

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

首先,我想将返回类型从bool更改为具有String键和布尔值的某些Generic Collection类型我不知道这是否是最佳方法。

这种情况下的最佳做法是什么?

6 个答案:

答案 0 :(得分:32)

制作类似

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

并返回ValidationResponse的对象

答案 1 :(得分:10)

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

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

bool DoSomething (out string anInformativeMessage)

HOWEVER 我个人认为最好的方法是返回Dhinesh在答案中描述的Result课程,因为它更灵活,而且本质上是OO。我正在为完整性添加这种方法;)

答案 2 :(得分:3)

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

  2. 另一种选择是使用Tuple对象存储stringboolTuple<string, bool>将是您的返回类型。 (仅适用于.NET 4.0以上版本)

答案 3 :(得分:1)

将Result类创建为其他答案中建议的新返回类型存在破坏现有代码的问题。

如果您希望/需要避免这种情况,您可以引入一个新的string LastError属性,其中包含上次调用方法的错误消息,并保持方法签名不变。你会像

一样使用它
bool success = myObject.MyMethod();
if(!success)
    Console.Error.WriteLine(myObject.LastError);

这种方法不适合多线程环境。

答案 4 :(得分:1)

如果期望 XML层次结构将验证 - 那么我会说这是您应该使用异常的典型示例。然后该方法返回void并抛出失败,如下所示:

void validateXMLHierarchy();

并使用

try
{
  validateXMLHierarchy();
}
catch (XmlValidationException ex)
{
  Console.Error.WriteLine(ex.Message);
}

答案 5 :(得分:1)

我不了解最佳做法,但如果您只有以下两种情况:

  1. 返回true,没有额外信息
  2. 返回false,附加额外信息
  3. 然后你可以将其简化为只返回一个字符串。如果没有错误,则返回一个空字符串,相当于错误代码为零。

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