null test与try catch

时间:2009-12-09 14:58:37

标签: c#

有没有人在try catch中执行null测试与包装代码的指标?

我怀疑null测试效率更高,但我没有任何经验数据。

环境是C#/。net 3.x,代码比较是:

Dude x = (Dude)Session["xxxx"];
x = x== null ? new Dude(): x;

Dude x = null;
try {
    x = (Dude)Session["xxxx"];
    x.something();
} catch {
    x = new Dude();
}

在try catch中包装有什么好处吗?

11 个答案:

答案 0 :(得分:22)

如果null是可能的预期值,则测试null。如果您不喜欢null测试并且具有默认值,则可以使用null coelescing运算符来设置默认值:

// value is (Dude)Session["xxxx"] if not null, otherwise it's a new object.
Dude x = (Dude)Session["xxxx"] ?? new Dude();

保存try / catch for Exceptions(真正意外的事件)。

答案 1 :(得分:9)

如果您正在寻找紧凑型代码,您可以:

Dude x = Session["xxxx"] as Dude ?? new Dude();

??运算符将返回两个值的第一个非空值(如果有)。

由于

答案 2 :(得分:4)

我认为这将是最快的路线:

Dude x = (Dude)Session["xxxx"] ?? new Dude();

?? operator是一个快捷方式,用于在您想要指定特定值(如果它为空)时进行空检查。

无论如何,异常最终不仅会创建一个新对象,而且还会生成一个堆栈跟踪,从而减慢速度。

答案 3 :(得分:1)

异常会占用额外的内存和时间。如果它是一个可能的值,那么测试null总是更好。

答案 4 :(得分:1)

另一件事是要考虑它只是更少的代码和更可读的空测试。通常使用try / catch块为正常情况下的代码添加基本上没有开销,但是当触发异常时它非常昂贵。

答案 5 :(得分:0)

我同意@Justin Niessner。此外,您可能希望阅读此article,其中显示了一些有趣的观点。

答案 6 :(得分:0)

您不应该在程序的正常代码路径中使用try / catch。如果你这样做,你将创建垃圾收集器需要处理的常量垃圾。更好的是只测试null。

答案 7 :(得分:0)

在这种情况下异常应该可以正常工作,但我相信数字#1是最好的方法。异常不应该用作If / else语句,异常会引发错误,这会占用比第一次比较更多的系统资源。

答案 8 :(得分:0)

永远不要使用程序控制流程的异常。你想要创建异常的唯一一次是,如果(Dude)Session["xxxx"];为null是因为停止你所在方法的运行。即,如果一个空值会阻止该方法成功完成它的功能叫做表演。在你写这个问题的时候,如果在这种情况下你需要做的就是继续创建一个新的Dude(),那么情况并非如此,所以不保证例外。

答案 9 :(得分:0)

对例外情况使用例外 - 不是正常的程序流程。

如果你不得不做很多空检查,请考虑使用Null Object Pattern而不是使用实空值来表示可能具有默认行为的不存在的值。

在我开始使用Objective-C之前,我总是对Null对象模式有点怀疑,因为它是内置行为。它确实清理了很多代码(当然,它仍然不合适)。

答案 10 :(得分:0)

由于您只想检查null,这就是您应该做的。它比捕获异常更有效。

此外,通过捕获异常,您应该非常具体,只能准确捕捉到您的期望。如果你发现任何类型的异常,你就有可能发现你没有预料到的错误并以错误的方式处理它们。

相关问题