Assert.IsNotNull(·)Assert.AreNotEqual(null,·)之间是否存在功能差异?

时间:2013-08-15 10:23:31

标签: c# .net mstest

Assert.IsNotNull(·) Assert.AreNotEqual(null,·)之间是否存在功能差异?

我更喜欢第一个,因为它更具可读性。一位同事使用了第二个,我想知道是否还存在功能差异。我知道将对象比较为null有时可能很奇怪(.Equals==之间的差异)。

2 个答案:

答案 0 :(得分:2)

简短回答是

长答案涉及查看实际的源代码。我使用反编译器检索了这个,所以有些可能看起来有点奇怪。评论由我添加。

// 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);
}

在我看来,IsNotNullAreNotEqual更清晰,并且在断言失败时给出的错误消息可能更容易理解。

答案 1 :(得分:1)

IsNotNull:验证指定的对象是否为空。如果断言为空,则断言失败。

AreNotEqual:验证两个指定的对象不相等。如果对象相等,则断言失败。

因此,函数IsNotNull仅验证一个指定对象不为空,而AreNotEqual比较两个对象。 IsNotNull函数将(稍微)快一点。

相关问题