是 DBNull 与 DBNull.Value.Equals()

is DBNull vs. DBNull.Value.Equals()

我很好奇使用 if(some_value is DBNull)if(DBNull.Value.Equals(some_value)) 的优缺点是什么。 我个人更喜欢 if(some_value is DBNull) 因为我觉得它更具可读性。 我知道微软建议根据 https://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx.

使用 if(DBNull.Value.Equals(some_value))

some_value is DbNull:检查 some_value 的 typeDBNull 的类型。如果您可以实例化 DBNull 的实例或从它继承,则可以使用它。但是不,这个 class 有私有构造函数并且是密封的。

DBNull.Value.Equals(some_value):根据 DBNull.Value.

表示的值检查 some_value 的

value is DBNull实际上检查value是否是DBNullclass的实例,而value == DBNull.Value实际上执行[=11=之间的引用比较] 和单例的唯一实例 class DBNull.

value is DBNull 检查 value 是否是 DBNull 的实例,这只有在 value == DBNull.Value 时才有可能,因为 DBNull 是单例。

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

我会选择 DBNull.Value.Equals 方式。

为什么?

因为 is 将检查类型是否相等。它必须查找左手类型并将其与它也必须查找的右手类型进行匹配。之后它可以比较类型,很可能是通过检查引用相等性。

这会比 DBNull.Value.Equals 只检查引用相等性效率低。由于 DBNull.Value 只有一次实例,因此此检查非常准确且非常快速。