C# 返回布尔值和字符串值的最佳实践是什么
我创建了一个方法,该方法对运行时由另一个类在Javascript文本中动态生成的XML层次结构执行一些验证 我的方法当前返回True或False,这对使用我的类的任何人都有帮助,但我还想返回更多信息,因为可能有几个原因会抛出错误消息 起初,我想将返回类型从bool更改为一些具有字符串键和布尔值的通用集合类型,我不知道这是否是最好的方法C# 返回布尔值和字符串值的最佳实践是什么,c#,C#,我创建了一个方法,该方法对运行时由另一个类在Javascript文本中动态生成的XML层次结构执行一些验证 我的方法当前返回True或False,这对使用我的类的任何人都有帮助,但我还想返回更多信息,因为可能有几个原因会抛出错误消息 起初,我想将返回类型从bool更改为一些具有字符串键和布尔值的通用集合类型,我不知道这是否是最好的方法 在这种情况下,最佳做法是什么 在.NET数据类型(例如)的TryParse方法中使用的一种模式在C世界中非常常见,即返回布尔值以表示成功或失败。用户还必须通过引用
在这种情况下,最佳做法是什么 在.NET数据类型(例如)的
TryParse
方法中使用的一种模式在C世界中非常常见,即返回布尔值以表示成功或失败。用户还必须通过引用方法传入一个值,以接收解析后的值
根据您的情况,您的方法签名可能如下所示:
bool DoSomething (out string anInformativeMessage)
然而我个人认为最好的方法是返回一个结果
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);
}
我不知道最佳实践,但如果您只有以下两种情况:
string errorMsg = myObject.MyMethod();
if (errorMsg != String.Empty) {
Console.Error.WriteLine(errorMsg);
}
感谢rmx,我只触及了4.0的表面,但很高兴了解Tuple对象。元组的优点是易于使用,但自定义结果类为各个返回值提供了自描述性名称。元组可能适合简单的情况,但我更喜欢一个实际返回类或一个out参数。现在命名元组将是解决选项二的好方法。dhinesh,我喜欢你的建议。它看起来非常干净、可扩展,并且仍然实现了我想要的结果。谢谢但是在函数中实现它会是什么样子呢?我更喜欢这里的out参数,因为消息只由方法写入。使用out还可以保证消息参数被赋值。@gnafoo您说得很对,这正是TryParse实现它的方式。更新的答案。在这种情况下,我可能会提供一个新的扩展方法以及旧的方法。额外过载(例如带有out参数)也可能适用。然后可以重新编写旧方法来调用新方法,并丢弃附加信息。