TwoDPoint 是一个 class 类型,它是一个引用类型。因此,允许引用特殊值null。因此,TwoDPoint 类型的值 p 可能是 null。
对于class 类型,您在public bool Equals 非静态方法中,“this”永远不会是null,因此只要p 参数返回false 是正确的是null。
// Example 1
var t = new Point(10, 4);
var p = (Point)null;
var isEqual = t.Eqauls(p); // should return 'false', therefore the code you ask about
// Example 2
var t = (Point)null;
var p = (Point)null;
var isEqual = t.Eqauls(p); // 'NullReferenceException', method not called
在上面,您看到了它对引用类型的工作原理。
使用用于可为空的值类型的特殊Nullable<>类型,情况有所不同。但好消息是您不必为 Nullable<>.Equals 编写代码,因为它已经在 .NET Framework 中了。
// Example 3
var t = (TimeSpan?)TimeSpan.FromHours(3.5);
var p = (TimeSpan?)null;
var isEqual = t.Equals(p); // will return 'false'
// Example 4
var t = (TimeSpan?)null;
var p = (TimeSpan?)null;
var isEqual = t.Equals(p); // OK, method will return 'true'!
在示例 4 中,没有出现 null reference。存在的“null”是Nullable<TimeSpan> 结构的值,其HasValue 属性等于false。 Equals 方法在 Nullable<> 中声明(在本例中为覆盖),因此不会发生装箱。
不同:
// Example 5
var t = (TimeSpan?)null;
var type = t.GetType(); // 'GetType' declared in class (System.Object), boxing, 'NullReferenceException'!