首页 > 解决方案 > 在 C# 中是否有另一种方法来链接相互关联的“if”块?

问题描述

比如说,有 5 个(或更多)任务(方法)返回truefalse;如果任何连续的方法返回,我正在使用一种算法语法来打破链,false否则继续向内。目前,我已经构建了一堆相互链接的 if 块;但是,对我来说似乎很丑陋,并且很难通过一堆论据来阅读。

if (Method_1_Returns(String manyArgs, ...) == true) {
    if (Method_2_Returns(String manyArgs, ...) == true) {
        if (Method_3_Returns(String manyArgs, ...) == true) {
            if (Method_4_Returns(String manyArgs, ...) == true) {
                ...
            }
            else {
                MethodToShowError(someString_4);
            }
        }
        else {
            MethodToShowError(someString_3);
        }
    }
    else {
        MethodToShowError(someString_2);
    }
}
else {
    MethodToShowError(someString_1);
}

我打算把它转换成一个switch块,但除了讨厌goto指令之外,这似乎不符合编码标准(或者,是吗?)。

String temp = "1";

switch (temp) {
    case "1":
        if (Method_1_Returns(String manyArgs, ...)) goto case "2";
        MethodToShowError(someString_1);
        break;
    case "2":
        if (Method_2_Returns(String manyArgs, ...)) goto case "3";
        MethodToShowError(someString_2);
        break;
    case "3":
        if (Method_3_Returns(String manyArgs, ...)) goto case "4";
        MethodToShowError(someString_3);
        break;
    case "4":
        if (Method_4_Returns(String manyArgs, ...)) goto case "5";
        MethodToShowError(someString_4);
        break;
    ...
    default:
        break;
    }

C# 中是否存在更好的替代方案?switch块替代可以接受吗?

标签: c#

解决方案


这里最简单的建议是快速失败:

if (!Method_1_Returns(String manyArgs, ...)) {
    MethodToShowError(someString_1);
    return;
}

if (!Method_2_Returns(String manyArgs, ...)) {
    MethodToShowError(someString_2);
    return;
}

if (!Method_3_Returns(String manyArgs, ...)) {
    MethodToShowError(someString_3);
    return;
}

if (!Method_4_Returns(String manyArgs, ...)) {
    MethodToShowError(someString_4);
    return;
}

除此之外,它实际上取决于被调用的方法链。如果它们都具有相同的签名并采用相同的参数,那么它们可以被放入一个数组并在循环中调用。


推荐阅读