ValueType.Equals(null)的底层实现及CLR虚拟机对其结构支持

在定义任何一个ValueType之后,它都是从System.ValueType继承过来的,默认的就继承了Equals方法和GetHashCode方法,在使用的时候,必须主意的是最好重写自定义ValueType的这两个方法,因为可能带来性能上面的严重问题或者是比较的不正确。

譬如定义下面这样的一个结构体值类型:

struct TestValueType
    {
        public int Myint;
        public float Myfloat;
    }
    TestValueType V1,V2;
V1.Equals(V2);

可以翻开sscli看看ValueType的equals方法的实现:

public override bool Equals (Object obj)
        {
            if (null==obj) {
                return false;
            }
            RuntimeType thisType = (RuntimeType)this.GetType();
            RuntimeType thatType = (RuntimeType)obj.GetType();
            if (thatType!=thisType) {
                return false;
            }
            Object thisObj = (Object)this;
            Object thisResult, thatResult;
            // if there are no GC references in this object we can avoid reflection
            // and do a fast memcmp
            if (CanCompareBits(this))
                return FastEqualsCheck(thisObj, obj);
            FieldInfo[] thisFields = thisType.GetFields(BindingFlags.Instance
                            | BindingFlags.Public | BindingFlags.NonPublic);

            for (int i=0; i<thisFields.Length; i++) {
                thisResult = ((RtFieldInfo)thisFields[i]).InternalGetValue(thisObj,false);
                thatResult = ((RtFieldInfo)thisFields[i]).InternalGetValue(obj, false);

                if (thisResult == null) {
                    if (thatResult != null)
                        return false;
                }
                else
                if (!thisResult.Equals(thatResult)) {
                    return false;
                }
            }
            return true;
        }

首先得到比较两个对象的Type,如果类型不一样就直接返回。

然后对于能够进行快速比较的值类型,就使用快速比较:

// if there are no GC references in this object we can avoid reflection
// and do a fast memcmp
if (CanCompareBits(this))
return FastEqualsCheck(thisObj, obj);

时间: 2025-01-27 06:54:58

ValueType.Equals(null)的底层实现及CLR虚拟机对其结构支持的相关文章

[CLR via C#]26. 计算限制的异步操作

原文:[CLR via C#]26. 计算限制的异步操作 一.CLR线程池基础     前面说过,创建和销毁线程是一个比较昂贵的操作,太多的线程也会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以太多的线程还有损于性能.为了改善这个情况,CLR使用了代码来管理它自己的线程池.可将线程池想像成可由你的应用程序使用的一个线程集合.每个进程都有一个线程池,它在各个应用程序域(AppDomain)是共享的.     CLR初始化时,线程池是没有线程的.在内部,线程池维护了一个操作请求

[c#基础]值类型和引用类型的Equals,==的区别

引言 最近一个朋友正在找工作,他说在笔试题中遇到Equals和==有什么区别的题,当时跟他说如果是值类型的,它们没有区别,如果是引用类型的有区别,但string类型除外.为了证实自己的说法,也研究了一下,以免误导别人,这里将研究结果总结一下,如果我有什么地方说的不对的地方,望指出. 相等性 在定义类或结构时,您将决定为类型创建值相等性(或等效性)的自定义定义是否有意义. 通常,当类型的对象预期要添加到某类集合时,或者当这些对象主要用于存储一组字段或属性时,您将实现值相等性. 您可以基于类型中所有

java为什么要重写hashCode和equals方法

  如果不被重写(原生)的hashCode和equals是什么样的?       不被重写(原生)的hashCode值是根据内存地址换算出来的一个值.       不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2).   为什么需要重写equals和hashCode方法?       在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等.在这种情况下,原生的equals方法就不能满足我们的需求了    

使用 SQL Server 2005中的 CLR 集成

本文描述了数据库应用程序开发人员和架构师如何利用 SQL Server 2005 中的 CLR 集成功能.本文对基于 CLR 的编程方式与 SQL Server 中支持的现有编程模型(如 TransacT-SQL 和扩展存储过程)进行了比较,并且强调了各自相对的优缺点.还提供了一组选择合适的编程替代方法的高级指导,以及一些示例和代码示例. 一.简介 Microsoft 通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显

.Net平台下CLR程序载入原理分析

程序 Flier Lu <flier_lu@sina.com.cn>   注意:本系列文章在水木清华BBS(smth.org)之.Net版首发,      转载请保留以上信息,发表请与作者联系     与传统的Win32可执行程序中的本机代码(Native Code)不同, 微软推出的.Net架构中,可执行程序的代码是以类似Java Byte Code的 IL (Intermediate Language)伪代码形式存在的.在.Net可执行程序载入后, IL代码由CLR (Common Lan

Java hashCode()和equals()的几个问题

本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equals() 之间有什么联系? 第1部分 equals() 的作用 equals() 的作用是 用来判断两个对象是否相等. equals() 定义在JDK的Object.java中.通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等.源码如下: public boolean equ

深入equals方法对象相等比较

equals方法的重要性毋须多言,只要你想比较的两个对象不愿是同一对象,你就应该实现equals方法,让对象用你认为相等的条件来进行比较.下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为这些规范在事实中并不是真正能保证得到实现. 1.对于任何引用类型, o.equals(o)==true 成立. 2.如果 o.equals(o1)==true 成立,那么o1.equals(o)==true也一定要成立. 3.如果 o.equals(o1)==true 成立且o

Java equals 方法与hashcode 方法的深入解析

面试时经常会问起字符串比较相关的问题,比如:字符串比较时用的什么方法,内部实现如何?hashcode的作用,以及重写equal方法,为什么要重写hashcode方法?以下就为大家解答,需要的朋友可以参考下   PS:本文使用jdk1.7解析1.Object类 的equals 方法 复制代码 代码如下:    /**      * Indicates whether some other object is "equal to" this one.      * <p>   

Java equals的一个坑

  public class StringEqualsObject { public static void main(String[] args) { String name="Tom"; Person p=new Person(name); System.out.println(name.equals(p)); System.out.println("p.toString():"+name.equals(p.toString())); System.out.pr