4

在 C# 中,有时存在不返回值的代码路径,编译器出错并允许您修复它们很好。然而,有时结构上是一个不存在的地方,但 ALOGIRTHM 会阻止这种结构的发生。

这是一个简单的人为示例。

public static int test1(bool a)
    {
        if (a) return 1;
        if (!a) return 2;
    }

当然人们会告诉我,我的“算法”是愚蠢的,我的第二次测试是多余的,我应该这样做。

public static int test1(bool a)
    {
        if (a) return 1;
        else return 2;
    }

甚至

public static int test1(bool a)
    {
        if (a) return 1;
        return 2;
    }

我特意选择了这个简单的“冗余”示例,而不是我的真实世界算法,因为我想专门关注这个问题,而不是我可以编写算法的 10 种不同的方式 :)

那么有什么可能的方法来处理这个问题,以及每种方法的优缺点是什么。

1) 是我们刚刚介绍的,那就是重构算法。有时这可能是不可能的,或者最终结果可能不符合标准,易于阅读/理解或维护。

其他只是返回一些永远不会发生的东西,比如 null .. 但在这种情况下,我正在处理一个整数,我必须输入 0,这感觉更脏

public static int test1(bool a)
    {
        if (a) return 1;
        if (!a) return 2;
        //this code never happens, but i need to keep the compiler happy
        return 0;
    }

或使用例外

public static int test1(bool a)
    {
        if (a) return 1;
        if (!a) return 2;
        throw new Exception("this code never happens, but i need to keep the compiler happy");
    }

但是每次我处理这个问题时,无论我采用什么技术,我对结果都不满意并且感觉有点脏。

有替代品吗?

4

5 回答 5

4

通常,Exception当出现特殊情况时,您会抛出 s ... bool 不是truefalse将是相当特殊的!我会抛出异常以使编译器满意,但也因为您不知道该方法将来会如何更改。

由于您使用布尔值的确切原因,我在处理布尔值时不会认为它if ... else很脏,它们只有两个值,当有更多可能性(即字符串)时,您可以使用更复杂的测试。

于 2013-08-16T18:57:54.160 回答
3

当您遇到所有代码路径都没有返回值的编译错误时,没有要设置的标志或“技巧”,您必须返回默认值或抛出异常。我坚信抛出 InvalidOperationException(“到达意外代码,此方法已被错误修改”)。

为什么它不脏:如果其他人出现并进行更改导致您的异常被抛出,他们会知道他们做了一些异常作者认为根本错误的事情。返回默认值可能会悄悄地破坏方法的使用者,因此使用异常作为安全网是一种很好的做法。

于 2013-08-16T19:11:27.837 回答
0

在这种情况下您可能会考虑的另一个选项是使用Debug.Fail()方法。

public static int test1()
{
    if (myComplexAlgo()) return 1;
    if (myCatchAllAlgo()) return 2;
    Debug.Fail("I should never be here!");
    return -1;
}

它并不适合所有人,这种方法的优点是您可以使用它来确保您的测试失败,而不会导致您的生产代码崩溃。如果您的算法或条件发生变化,这可以(希望)在代码中捕获未来的问题。

于 2013-08-16T19:25:18.840 回答
0
    public static int test1(bool a)
    {
        return a ? 1 : 2;
    }
于 2013-08-16T18:55:30.300 回答
0

使用一个变量并为其赋值,然后在函数结束时返回该值。

private bool isValid() 
{
bool result = false;
try {
    //some code 
    result = true;
    } catch {
    result = false;
    }
return result;
}
于 2013-08-16T19:20:05.490 回答