之间有功能上的区别Assert.IsNotNull(·)
Assert.AreNotEqual(null,·)
吗?
我更喜欢第一个,因为它更具可读性。一位同事使用了第二个,我想知道是否还有功能差异。.Equals
我知道将对象与 null 进行比较有时会很奇怪(和之间的区别==
)。
简短的回答是否定的。
长答案涉及查看实际的源代码。我使用反编译器检索了它,所以其中一些可能看起来有点奇怪。评论是我添加的。
// The IsNotNull overload that takes only "value" calls this one internally
public static void IsNotNull(object value, string message, params object[] parameters)
{
if (value != null)
return;
Assert.HandleFail("Assert.IsNotNull", message, parameters);
}
// The AreNotEqual that takes only "notExpected" and "actual" calls this one internally
public static void AreNotEqual<T>(T notExpected, T actual, string message, params object[] parameters)
{
if (!object.Equals((object) notExpected, (object) actual))
return;
Assert.HandleFail("Assert.AreNotEqual", (string) FrameworkMessages.AreNotEqualFailMsg(message == null ? (object) string.Empty : (object) Assert.ReplaceNulls((object) message), (object) Assert.ReplaceNulls((object) notExpected), (object) Assert.ReplaceNulls((object) actual)), parameters);
}
==
确实,与和进行比较是有区别的Equals
,但是当您与 null 进行比较时,它不应该有区别。如您所见,AreNotEqual
将输入值转换为object
并使用类的标准静态Equals
实现object
,实现如下:
public static bool Equals(Object objA, Object objB)
{
if (objA==objB) {
return true;
}
if (objA==null || objB==null) {
return false;
}
return objA.Equals(objB);
}
在我看来,IsNotNull
它比 更清晰AreNotEqual
,并且如果断言失败时给出的错误消息可能更容易一目了然。
IsNotNull
: 验证指定的对象不为空。如果它为空,则断言失败。
AreNotEqual
: 验证两个指定的对象不相等。如果对象相等,则断言失败。
所以该函数IsNotNull
只验证一个指定的对象不为空,同时AreNotEqual
比较两个对象。该IsNotNull
功能将(稍微)快一点。