null test与try catch

有没有人在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包装有什么好处吗?

如果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(真正意外的事件)。

如果紧凑的代码是你真正想要的,你可以:

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

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

谢谢

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

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

?? ?? 如果要为特定值(如果为null)分配特定值,则运算符是空检查的快捷方式。

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

例外需要额外的记忆和时间来捕捉。 如果它是一个可能的值,那么测试null总是更好。

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

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

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

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

切勿使用程序控制流程的exception。 你想要创建例外的唯一时间是if (Dude)Session["xxxx"]; 为null会导致停止您所在方法的运行。即,如果null值会阻止该方法成功完成它被调用的函数。 在你写这个问题的时候,如果在这种情况下你需要做的就是继续创建一个新的Dude(),那就不是这样了,所以不保证例外。

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

如果您不得不进行大量的空检查,请考虑使用Null对象模式而不是使用实空值来指示可能具有默认行为的不存在的值。

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

因为你只想检查null,这就是你应该做的。 它比捕获exception更有效。

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