2009-10-09 120 views
0

我在几个使用if(Is.NotNull(SomeObject))而不是if(SomeObject!= null)的项目中遇到了一些代码。这两种方法有什么区别吗?什么时候会使用某种特定的方法,还是只是一种风格选择?Is.NotNull和!= null之间的区别

回答

5

我看过Is.Not.Null作为NUnit的一部分,以及来自Rhino.Mocks的Is.NotNull

通常功能不会有任何不同 - Is.NotNull的缺点只是为了更“流利地”表达您的单元测试,或者自然地表达。关于测试的可读性已经有很多讨论,流畅的语法背后的想法是,当你从左到右阅读时,它会形成一个描述代码行正在做什么的句子。

+0

有趣...我怀疑这是它创建的原因,但也许它不应该放在System命名空间中。感谢您的洞察力。 – tbreffni 2009-10-09 14:49:01

+0

我同意...... NUnit版本非常烦人。如果你一起使用NUnit和Rhino,它就不得不完全限定一切。 – womp 2009-10-09 15:47:08

4

您示例中的Is类型不是我之前在基类库中见过的类型。这听起来像是某人在贵公司或其他地方写的东西,或许是“流利”图书馆的一部分。

4

还有可以会有细微的差别,如果SomeObject表达式的编译时间类型已经重载!=。我希望希望尽管如此,假设一切都已经得到合理实施,那么它最终不会有什么区别。

虽然很难确切地知道这里发生了什么,因为Is.NotNull不是基本类库的一部分,据我所知...这些项目是否使用其他实用程序库?这些是在单元测试还是生产代码?

+0

啊,你说得对,它不是基类库的一部分,它是我们在这里定制的外部程序集的一部分。该方法是在System名称空间中的一个名为“Is”的类中实现的,因此导致它认为它是BCL的一部分。谢谢你的帮助! – tbreffni 2009-10-09 14:45:00

0

例如,您可能需要查看Is.NotNull(),看它是否在对象的内部查找以确定是否设置了任何值。

这可能是一个对象由于更多的原因被认为是空的,而实际上是空的(或未设置)对象值。这可能是因为如果某些属性未设置必须设置,那么它也将被视为空。

1

可能有区别。如果SomeObject有一个等号/不等于超载可能就不会被称为出于同样的原因这两个语句是不同的:

if(x == null) ... 

- 或 -

if(((object)x) == null) ... 

后者将使用引用相等,而前者可能会使用操作员超载。

相关问题