ReferenceEqualityComparer.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / ReferenceEqualityComparer.cs / 1305376 / ReferenceEqualityComparer.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//  
// Provides a class that can compare objects for reference equality.
//  
//--------------------------------------------------------------------- 

//// #define NON_GENERIC_AVAILABLE 

#if ASTORIA_CLIENT
namespace System.Data.Services.Client
#else 
namespace System.Data.Services
#endif 
{ 
    #region Namespaces.
 
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq.Expressions;
    using System.Text; 
    using System.Collections;
 
    #endregion Namespaces. 

    /// Equality comparer implementation that uses reference equality. 
    internal class ReferenceEqualityComparer : IEqualityComparer
    {
        #region Private fields.
 
#if NON_GENERIC_AVAILABLE
        /// Singleton instance (non-generic, as opposed to the one in ReferenceEqualityComparer<T>. 
        private static ReferenceEqualityComparer nonGenericInstance; 
#endif
 
        #endregion Private fields.

        #region Constructors.
 
        /// Initializes a new  instance.
        protected ReferenceEqualityComparer() 
        { 
        }
 
        #endregion Constructors.

        #region Properties.
 
        /// Determines whether two objects are the same.
        /// First object to compare. 
        /// Second object to compare. 
        /// true if both are the same; false otherwise.
        bool IEqualityComparer.Equals(object x, object y) 
        {
            return object.ReferenceEquals(x, y);
        }
 
        /// Serves as hashing function for collections.
        /// Object to hash. 
        ///  
        /// Hash code for the object; shouldn't change through the lifetime
        /// of . 
        /// 
        int IEqualityComparer.GetHashCode(object obj)
        {
            if (obj == null) 
            {
                return 0; 
            } 

            return obj.GetHashCode(); 
        }

#if NON_GENERIC_AVAILABLE
        /// Singleton instance (non-generic, as opposed to the one in ReferenceEqualityComparer<T>. 
        internal ReferenceEqualityComparer NonGenericInstance
        { 
            get 
            {
                if (nonGenericInstance == null) 
                {
                    ReferenceEqualityComparer comparer = new ReferenceEqualityComparer();
                    System.Threading.Interlocked.CompareExchange(ref nonGenericInstance, comparer, null);
                } 

                return nonGenericInstance; 
            } 
        }
#endif 

        #endregion Properties.
    }
 
    /// 
    /// Use this class to compare objects by reference in collections such as 
    /// dictionary or hashsets. 
    /// 
    /// Type of objects to compare. 
    /// 
    /// Typically accesses statically as eg
    /// ReferenceEqualityComparer<Expression>.Instance.
    ///  
    internal sealed class ReferenceEqualityComparer : ReferenceEqualityComparer, IEqualityComparer
    { 
        #region Private fields. 

        /// Single instance per 'T' for comparison. 
        private static ReferenceEqualityComparer instance;

        #endregion Private fields.
 
        #region Constructors.
 
        /// Initializes a new  instance. 
        private ReferenceEqualityComparer() : base()
        { 
        }

        #endregion Constructors.
 
        #region Properties.
 
        /// Returns a singleton instance for this comparer type. 
        internal static ReferenceEqualityComparer Instance
        { 
            get
            {
                if (instance == null)
                { 
                    Debug.Assert(!typeof(T).IsValueType, "!typeof(T).IsValueType -- can't use reference equality in a meaningful way with value types");
                    ReferenceEqualityComparer newInstance = new ReferenceEqualityComparer(); 
                    System.Threading.Interlocked.CompareExchange(ref instance, newInstance, null); 
                }
 
                return instance;
            }
        }
 
        #endregion Properties.
 
        #region Methods. 

        /// Determines whether two objects are the same. 
        /// First object to compare.
        /// Second object to compare.
        /// true if both are the same; false otherwise.
        public bool Equals(T x, T y) 
        {
            return object.ReferenceEquals(x, y); 
        } 

        /// Serves as hashing function for collections. 
        /// Object to hash.
        /// 
        /// Hash code for the object; shouldn't change through the lifetime
        /// of . 
        /// 
        public int GetHashCode(T obj) 
        { 
            if (obj == null)
            { 
                return 0;
            }

            return obj.GetHashCode(); 
        }
 
        #endregion Methods. 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK