c# - 异常或 If/Else 语句

标签 c# .net exception if-statement

我对何时使用 Exception 或 If/Else 语句有疑问。 在我的情况下,我想检查 DocumentNode 是否是 TestNode。当它是一个TestNode时,我想获取该节点。

我在下面为此写了两个可能的解决方案。第一个解决方案认为它是一个 TestNode,否则它会给出一个异常。第二种解决方案 检查它是否是一个 TestNode,然后它执行大致相同的函数来获取该节点。谁能告诉我什么是最好的解决方案?或者有没有 更好的解决方案?谢谢,彼得。

*对不起我的英语不好..

private DocumentNode GetTestNode(IEnumerable<DocumentNode> nodes)
{
    foreach (DocumentNode node in nodes)
    {
        if (node.GetValueProperty().ToString() == "TestValue")
        {
            return node;
        }
    }
    throw new TestNodeNotFoundException("This is not a TestNode");
}

OR: 

private DocumentNode IsTestNode(IEnumerable<DocumentNode> nodes) 
{
    foreach (DocumentNode node in nodes)
    {
        if (node.GetValueProperty().ToString() == "TestValue")
        {
            return true;
        }
    }
    return false;
}

private DocumentNode GetTestNode(IEnumerable<DocumentNode> nodes)
{
    foreach (DocumentNode node in nodes)
    {
        if (node.GetValueProperty().ToString() == "TestValue")
        {
            return node;
        }
    }
}

最佳答案

如果可以的话,更好的解决方案是使用 LINQ。如果你想要一个异常(exception),你可以使用:

var node = nodes.Where(n => node.GetPropertyValue().ToString() == "TestValue")
                .First();

(如果恰好有一个这样的节点,您也可以使用Single。)

如果您不想出现异常,请改用 FirstOrDefault:

var node = nodes.Where(n => node.GetPropertyValue().ToString() == "TestValue")
                .FirstOrDefault();

如果没有 TestValue 节点,node 将为 null。

要测试测试节点是否存在,请使用Any

var isTest = nodes.Where(n => node.GetPropertyValue().ToString() == "TestValue")
                  .Any();

(您的 final 方法当前不会编译,因为它可以在不返回的情况下到达结尾。)

哪个合适实际上取决于您要做什么。如果缺少测试节点表明存在错误,则抛出异常是合适的。如果不是,使用 null 来表示这是非常合理的,或者您可以使用 TryXXX 模式显式返回一个 bool 值,同时保存在输出参数中找到节点(如果有)。

关于c# - 异常或 If/Else 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5714043/

相关文章:

c# - 并非所选主题的所有 CSS 文件都包含在页面中

c# - 重新排序数据表列

javascript - 将 RAL 转换为 HEX 颜色代码

c# - 使用 jQuery 驱动的双向数据绑定(bind) "Chosen"下拉

c# - 何时应处置 ManualResetEvent?

c++ - 自定义异常层次结构。来自 std::exception 和 std::bad_alloc 的可怕钻石

java - 在 Java 7 多捕获 block 中,捕获的异常的类型是什么?

c# - 当我想继承和添加属性时如何处理密封类

c# - 在没有 OverflowException 的情况下将 "1.79769313486232E+308"转换为 double?

c# - 如何使用 try catch 进行异常处理是最佳实践