zoukankan      html  css  js  c++  java
  • C#ValueType实现

    源码

    ValueType是Class,重要的重写了Object.Equals方法,导致值类型行为与引用类型的不同比较行为

    // ==++==
    // 
    //   Copyright (c) Microsoft Corporation.  All rights reserved.
    // 
    // ==--==
    /*============================================================
    **
    ** Class:   ValueType
    **
    **
    ** Purpose: Base class for all value classes.
    **
    **
    ===========================================================*/
    namespace System {
        using System;
        using System.Reflection;
        using System.Runtime.CompilerServices;
        using System.Runtime.Versioning;
     
        [Serializable]
    [System.Runtime.InteropServices.ComVisible(true)]
        public abstract class ValueType {
     
            [System.Security.SecuritySafeCritical]
            public override bool Equals (Object obj) {
                BCLDebug.Perf(false, "ValueType::Equals is not fast.  "+this.GetType().FullName+" should override Equals(Object)");
                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]).UnsafeGetValue(thisObj);
                    thatResult = ((RtFieldInfo)thisFields[i]).UnsafeGetValue(obj);
                    
                    if (thisResult == null) {
                        if (thatResult != null)
                            return false;
                    }
                    else
                    if (!thisResult.Equals(thatResult)) {
                        return false;
                    }
                }
     
                return true;
            }
        }
    }
    
    
  • 相关阅读:
    《必须知道的.net》读后感 转
    Web Service
    设计模式
    对做“互联网产品”的一些想法
    四大发明之活字印刷——面向对象思想的胜利
    每个IT人都应当拥有的30条技能
    面向对象的本质是什么?
    数据库设计规范 zhuan
    翻动100万级的数据 —— 只需几十毫秒 转
    程序员发展十分重要的12条日常习惯
  • 原文地址:https://www.cnblogs.com/Fallever/p/9980900.html
Copyright © 2011-2022 走看看