在阅读this article时,我看到如果仅对不可为空的值调用null参数,则Object.Equals覆盖应该返回false:
同时阅读给定的示例TwoDPoint是可为空的类型,但它与准则本身矛盾。
那么,实际上为可空类型重载Equals方法的最佳实践是什么?
答案 0 :(得分:2)
TwoDPoint
是一种class
类型,它是一种引用类型。这样,特殊值null
被允许作为参考。因此,类型p
的值TwoDPoint
可能是null
。
使用class
类型,即在public bool Equals
非静态方法中,“ this
”永远不会null
,因此返回{每当false
参数为p
时,{1}}。
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
类型(用于可空 value 类型),情况有所不同。但是好消息是,您不必为Nullable<>
编写代码,因为它已经在.NET Framework中。
Nullable<>.Equals
在示例4中,没有空的 reference 出现。存在的“空”是// 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'!
结构的值,其Nullable<TimeSpan>
属性等于HasValue
。 false
在Equals
中声明了Nullable<>
方法(在本例中为替代方法),因此没有装箱。
不同:
// Example 5
var t = (TimeSpan?)null;
var type = t.GetType(); // 'GetType' declared in class (System.Object), boxing, 'NullReferenceException'!
答案 1 :(得分:1)
TwoDPoint-是可为空的类型
否,import * as React from 'react';
import { any } from 'prop-types';
function handleClick(this:any,name:React.ReactNode) {
console.log('The link was clicked.');
this.props.callbackFromParentSearch(name);
}
export const Suggestions = (props:any) => {
const options = props.results.map((r: { id: React.Key; name: React.ReactNode; }) => (
<a href="#" onClick={handleClick(r.name)}>
<li key={r.id}>
{r.name}
</li>
</a>
))
return <ul>{options}</ul>
}
export default Suggestions
不是可以为空的类型,Nullable Type应该包含问号:
TwoDPoint
是可以为空的类型,它是TwoDPoint?
的简写
因此,如果您在可为空的类型上调用Nullable<TwoDPoint>
,它将不会调用覆盖/重载的方法。
Equals