在我的游戏中,有很多东西被检查,并且索引经常超出范围,如果有时候没有绘制或检查,通常都可以。目前我的代码很容易阅读,但是在调试时,由于记录的异常,游戏会丢失一两帧。虽然它在VS之外工作正常。当我试图避免使用大量if
语句的异常情况时,它大大降低了代码的可读性并消除了低fps丢失。我想知道它是否有任何其他影响。
答案 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));
这种特殊的扩展方法可能不适合您的情况,但这样的事情可以使您的代码非常简洁和简洁。