如果可以的话,可以使用很多`try`s而不是更多``

时间:2012-07-16 02:23:18

标签: c# visual-studio exception try-catch

在我的游戏中,有很多东西被检查,并且索引经常超出范围,如果有时候没有绘制或检查,通常都可以。目前我的代码很容易阅读,但是在调试时,由于记录的异常,游戏会丢失一两帧。虽然它在VS之外工作正常。当我试图避免使用大量if语句的异常情况时,它大大降低了代码的可读性并消除了低fps丢失。我想知道它是否有任何其他影响。

4 个答案:

答案 0 :(得分:7)

抛出异常是非常耗费资源的 - 使用if / then语句或其他“正常”流控制要快得多。

异常主要是昂贵的,因为生成Exception实例需要执行堆栈遍历以确定抛出异常的位置(堆栈跟踪)。它还为垃圾收集器创建了额外的负载,并且在特殊情况之外使用异常被认为是非常糟糕的设计。

答案 1 :(得分:4)

  

是否可以使用大量try s而不是更多if s?

如果您需要其中任何一个功能应用程序,那么您的设计可能出现问题。特殊情况通常应该是例外,而不是司空见惯。

你描述的情况(指数越界)显然不是例外,特别是因为你忽略了例外,因为这不是什么大问题。这是一个很大的暗示,你应该投入精力来防止例外事件的发生。

  

当我试图避免使用大量if语句的特殊情况时......

很多if语句不是一个很好的方法,正如你所发现的那样 - 它很难阅读,它可能会隐藏逻辑错误,这只会造成更多麻烦。

相反,请考虑为您的对象提供更明确定义和离散的职责,以防止他们进入可能特殊的状态。如果你需要“很多很多”的if语句,那么你的对象会检查很多条件,这意味着它们的责任可能太大了。

答案 2 :(得分:2)

通常,您应该编写代码并构造逻辑,以便不使用异常来处理程序逻辑。在某些情况下,可以使用异常来处理罕见期望的条件。但是,对于控制流应该避免异常,因为它们基本上是goto语句,可能使控制流非常混乱,并且它们不具备高性能。

在您的情况下,听起来不像使用异常来处理逻辑错误是合适的。事实上,这些例外听起来就像他们正在做的那样。也就是说,他们告诉你你的算法是错误的。

我建议您仔细查看代码,并确定代码抛出IndexOutOfBoundsException的原因。如果在内部处理您自己的参数时抛出它,您可能会遇到错误或设计不佳的算法。问,“这个指数来自哪里?”并且“有没有办法编写算法,以便在设计中加入边界,而不是作为事后的想法加入?”

答案 3 :(得分:0)

您应该始终编写代码以避免异常。它们的捕获成本非常高。

您还应该避免使用大量嵌套if语句。你没错,它们会降低你的代码的可读性。

您可能会发现switch语句可以提供帮助,但还有其他一些方法可以避免异常和if语句。

例如,您可以编写此扩展方法:

public static class Ex
{
    public static void IfBounded<T>(this T[] @this, int index, Action<T> action)
    {
        if (@this == null) throw new System.ArgumentNullException("@this");
        if (action == null) throw new System.ArgumentNullException("action");
        if (index >= @this.GetLowerBound(0) && index <= @this.GetUpperBound(0))
        {
            action(@this[index]);
        }
    }
}

现在您可以编写以下类型的代码:

var messages = new []
{
    "Hello",
    "Goodbye",
};

messages.IfBounded(-1, t => Console.WriteLine(t));
messages.IfBounded(0, t => Console.WriteLine(t));
messages.IfBounded(1, t => Console.WriteLine(t));
messages.IfBounded(2, t => Console.WriteLine(t));

这种特殊的扩展方法可能不适合您的情况,但这样的事情可以使您的代码非常简洁和简洁。