EffectiveC#9--明白几个相等运算之间的关系
2015-10-13 22:36
501 查看
1.当你创建你自己的类型时(不管是类还是结构),你要定义类型在什么情况下是相等的。C#提供了4个不同的方法来断定两个对象是否是相等的
2.从两个你可能从来不会修改的方法.
Object.ReferenceEquals()在两个变量引用到同一个对象时返回true。不管比较的是引用类型还是值类型的方法总是检测对象引用而不是内容。这就是说当测试两个值类型是否相等时,ReferenceEquals()总返回false,即使比较同一个值类型对象。原因是:这里有两个装箱 (译注:因为参数要求两个引用对象,所以用两个值类型来调用该方法,会先使两个参数都装箱,这样一来,两个引用 对象自然就不相等了。)
Object.Equals()方法在你不清楚两个参数的运行类型时什么时,检测它们是否相等。它的实现代码如下
3.实例的Object.Equals()函数--默认行为与Object.ReferenceEquals()是一样的,但是值类型是不一样的
你应该在什么时候来重写它:创建一个值类型时,总是重写实例的Equals()函数。说白了就是如果你的类型须要遵从值类型的语义(比较内容)而不是引用类型的语义(比较对象ID)时,你应该自己重写实例的Object.Equals()方法
如何做?未看明白。。。。
public static bool ReferenceEquals ( object left, object right ); public static bool Equals ( object left, object right ); public virtual bool Equals( object right); public static bool operator==( MyClass left, MyClass right );
2.从两个你可能从来不会修改的方法.
Object.ReferenceEquals()在两个变量引用到同一个对象时返回true。不管比较的是引用类型还是值类型的方法总是检测对象引用而不是内容。这就是说当测试两个值类型是否相等时,ReferenceEquals()总返回false,即使比较同一个值类型对象。原因是:这里有两个装箱 (译注:因为参数要求两个引用对象,所以用两个值类型来调用该方法,会先使两个参数都装箱,这样一来,两个引用 对象自然就不相等了。)
Object.Equals()方法在你不清楚两个参数的运行类型时什么时,检测它们是否相等。它的实现代码如下
public static bool Equals( object left, object right ) { // Check object identity if (left == right ) return true; // both null references handled above if ((left == null) || (right == null)) return false; return left.Equals (right); } 静态的Equals()是使用左边参数实例的Equals()方法来断定两个对象是否相等
3.实例的Object.Equals()函数--默认行为与Object.ReferenceEquals()是一样的,但是值类型是不一样的
static void Main(string[] args) { int i = 5; int j = 5; Console.WriteLine(i.Equals(j).ToString());//true 两个值类型的变量相等,如果它们的类型和内容都是一样的。 double j = 5; Console.WriteLine(i.Equals(j).ToString());//false Console.ReadKey();
}
你应该在什么时候来重写它:创建一个值类型时,总是重写实例的Equals()函数。说白了就是如果你的类型须要遵从值类型的语义(比较内容)而不是引用类型的语义(比较对象ID)时,你应该自己重写实例的Object.Equals()方法
如何做?未看明白。。。。
相关文章推荐
- jQuery 获取屏幕高度、宽度
- css选择器
- CSS3 图片旋转
- jquery中attr和prop的区别
- poj 3253 Fence Repair
- 10.13 js入门
- js2次学习----常用知识点总结
- 超链接访问过后hover样式就不出现的问题
- css的伪类说明
- html常用对照表
- js的BOM对象完全解析
- html+css2次学习----a链接的href属性的使用
- DIV+CSS设计IE6浮动产生双倍距离
- 一个奇怪的html上url参数问题
- html+css2次学习-----常用知识点总结
- JavaScript中功能自动生成网页元素且可以增删改克隆(按钮,文本等)
- EXTJS表格功能扩展
- js获取上一个月、下一个月格式为yyyy-mm-dd的日期
- JQuery中对option的添加、删除、取值
- window.close无效的js解决方案