Assert.IsNotNull(·) Assert.AreNotEqual(null,·)之间有功能上的区别吗?

我更喜欢第一个,因为它更具可读性。一个同事用了第二个,我想知道是否还有功能上的区别。我知道将对象与null进行比较有时会很奇怪(.Equals==之间的区别)。

最佳答案

最简洁的答案是不。

长的答案涉及查看实际的源代码。我使用反编译器检索了此文件,因此其中一些看起来有些奇怪。评论是由我添加的。

// 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更清晰,并且断言失败时给出的错误消息一目了然。

10-06 09:22