C#要么返回false,要么什么都不做

use*_*702 3 .net c# if-statement return

我想知道是否有办法不必重复相同的if构造,而是调用StatusCheck().成功时它不能返回true.谁知道这个问题有更好的头衔?

bool Enable()
{
    if (!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
    // do stuff

    if (!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
    // do more stuff

    if (!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
    // do even more stuff

    // 6 more times the above

    return true;
}
Run Code Online (Sandbox Code Playgroud)

Nei*_*ell 6

我会将由"Do stuff"表示的代码重构为方法.您调用这些方法并捕获异常或检查这些方法的返回值(可能是当前状态),而不是重复调用GetStatus().

另外,我不明白为什么一个被调用的方法GetStatus()会有一个ref参数似乎是由具有当前状态的方法更新的?如果你必须拥有GetStatus()GetStatus()没有参数的方法,并实际返回当前状态.

Status status = GetStatus();
Run Code Online (Sandbox Code Playgroud)

如果您选择允许这些方法抛出异常,那么请注意,在抛出异常时不要开始应用实际逻辑 - 异常不是控制程序流的正确方法.


Fré*_*idi 6

CheckStatus()如果状态无效,您可以创建抛出异常的方法,然后在Enable()方法中处理该异常:

public void CheckStatus(int status)
{
    if (!IsValidStatus(status)) {
        throw new InvalidStatusException(status);
    }
}

public bool Enable()
{
    try {
        CheckStatus(status);
        // do stuff

        CheckStatus(status);
        // do more stuff

        CheckStatus(status);
        // do even more stuff

        // 6 more times the above

        return true;

    } catch (InvalidStatusException) {
        Trace.WriteLine("Error");
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 作为一个原则,你不应该抛出异常作为正常程序流程的一部分,它可以工作,但它可以降低性能,一些调试可能会更棘手. (4认同)
  • @David,嗯,这取决于.获得无效状态真的是"正常程序流程的一部分"吗?:) (2认同)
  • @FrédéricHamidi::)当然对于这种特殊情况,调试器噪声并不重要.但如果他将这种模式遍布整个地方(很可能,因为这就是他的SDK的结构),这可能会变得巨大.然后,我们可能会在正常运行期间获得100多个第一次机会异常.解决方案可能是使用设计更好的SDK:P (2认同)

Alm*_*und 5

根据你想要的严重程度,你可以构建某种行动队列,以便在方法中打破"做事".

protected delegate void DoStuffDelegate(ref {TYPE} statusToCheck);

bool Enable()
{
  List<DoStuffDelegate> stuffToDo = new ...
  stuffToDo.Add(myFirstMethod);
  stuffToDo.Add(mySecondMethod);
  foreach(var myDelegate in stuffToDo)
  {
    if(!GetStatus(ref status)) { Trace.WriteLine("Error"); return false; }
    myDelegate(ref status);
  }
}
Run Code Online (Sandbox Code Playgroud)

对于好的和坏的C#都不允许任何其他构造(如预处理器定义或我们在C++中得到的).