我有几个地方需要比较 2 个(可为空)值,看看它们是否相同。
我认为框架中应该有一些东西可以支持这一点,但找不到任何东西,所以改为以下:
public static bool IsDifferentTo(this bool? x, bool? y)
{
return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value;
}
然后,在代码中我有
if (x.IsDifferentTo(y)) ...
然后我对可空整数、可空双精度等有类似的方法。
有没有更简单的方法来查看两个可空类型是否相同?
更新:
原来这个方法存在的原因是因为代码是从 VB.Net 转换而来的,其中 Nothing = Nothing 返回 false(与 C# 中 null == null 返回 true 相比)。 VB.Net 代码应该使用
.Equals...
来代替。
C# 支持“提升”运算符,因此如果类型(在本例中为
bool?
)在编译时已知,您应该能够使用:
return x != y;
如果您需要仿制药,那么
EqualityComparer<T>.Default
是您的朋友:
return !EqualityComparer<T>.Default.Equals(x,y);
但请注意,这两种方法都使用“
null == null
”方法(与 ANSI SQL 对比)。如果您需要“null != null
”,那么您必须单独测试:
return x == null || x != y;
您可以使用Nullable<T>
的
Equals方法:
bool areDifferent = x.Equals(y);
您的方法则简化为:
public static bool IsDifferentTo(this bool? x, bool? y) => !x.Equals(y);
这对于仅仅调用 equals 来说是多余的:
one.IsDifferentTo(other)
与 !one.Equals(other)
相同。IsDifferentTo(one, other)
与 !Nullable.Equals(one,other)
相同。这不会抛出 NullReferenceException,因为
int?
(Nullable<int>
的同义词)是一个结构体 — 一种值类型,而不是引用类型。
您可以快速测试一下:
Nullable<int> test = null;
// result is false; no NullReferenceException is thrown.
bool isNull = test.HasValue;
您可以在 System.Object 上使用静态 Equals 方法:
var equal = object.Equals(objA, objB);
只需使用
==
或 .Equals()
。
我想找到如何在 C# 上比较两个可为空的 int,但我总是在搜索后得到此链接,因此如果有人需要精确比较两个可为空的 int,那么这会很有帮助
a.GetValueOrDefault(int.MinValue).CompareTo(b.GetValueOrDefault(long.MinValue));
(x?? 0).Equals(y)
将处理 null 以及 equals。