DBNull与DBNull.Value.Equals()有什么区别?

7

4
这并不是重复的问题,这个问题与那个不同。 - Ehsan Sajjad
3个回答

3
我会选择使用 DBNull.Value.Equals 方法。
为什么呢?
因为 is 运算符会检查类型是否相等。它必须查找左侧的类型并将其与右侧的类型进行匹配,然后才能比较这些类型,最可能是通过检查引用相等性来实现。
这比仅检查引用相等性要低效得多,而 DBNull.Value.Equals 却可以直接检查引用相等性,因此更加高效。由于只有一个 DBNull.Value 实例,所以此检查非常准确且非常快速。

而且使用==!=甚至更好,更快 :) - Ivan Stoev
如果我没记错的话,这应该与“Equals”相同。两者都检查引用相等。@IvanStoev - Patrick Hofman
不完全是这样。它将是ReferenceEquals,即简单的IL指令。 - Ivan Stoev
除了性能之外,这两个操作的结果是否有任何区别?我知道它们非常不同,但是我想不出一个例子,因为DBNull是密封的,所以它们会产生不同的结果。 - mobal

2

value is DBNull实际上检查value是否是DBNull类的实例,而value == DBNull.Value则执行value和单例类DBNull的唯一实例之间的引用比较。

value is DBNull检查value是否是DBNull的实例,这仅在value == DBNull.Value的情况下才可能发生,因为DBNull是一个单例。

使用value == DBNull.Value的优点是它执行直接引用比较,这比确定is DBNull比较的类型更有效率。


0

some_value is DbNull:检查 some_value 的类型是否与 DBNull 的类型相同。如果您可以实例化一个 DBNull 实例或从中继承,则可以使用此方法。但是,这个类有私有构造函数并且是密封的。

DBNull.Value.Equals(some_value):检查 some_value 的值是否与 DBNull.Value 所代表的值相同。


没有优劣之分。两者比较的是完全不同的东西——一种情况下是类型,另一种情况下是值。因地制宜。 - Vijay Gill
2
一般来说,你是正确的。但在 DbNull 的情况下,结果是相同的:DbNull.Value 是 DbNull 类型唯一可能的值。 - Hans Kesting
你能详细说明结果如何相同吗?两者比较的是不同的东西——一个比较类型,另一个比较值。 - Vijay Gill
@VijayGill 这是一个 Singleton,因此只有一个该类型的实例 DBNull.Value。因此,如果类型相同,则引用也将相同。当然,如果引用相等,则类型也相等。 - juharr
@VijayGill 因为 DBNull 是单例并且 DBNull.ValueDBNull 的唯一实例,所以只有当 value == DBNull.Value 时,value is DBNull 才可能成立,反之亦然。 - Thorsten Dittmar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接