C# 中有两种不同的相等:引用相等和值相等。
    ◎值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。
    ◎引用相等意味着要比较的不是两个对象,而是两个对象引用,且两者引用的是同一个对象。
    若要检查引用相等性,应使用 ReferenceEquals。若要检查值相等性,请使用 Equals。

    Equals:

 下面的语句对于 Equals  方法的所有实现均必须为真。在列表中,x、y 和 z 表示不为 null 的对象引用。

    * 除涉及浮点型的情况外,x.Equals(x) 都返回 true。请参见 IEC 60559:1989, Binary Floating-point Arithmetic for Microprocessor Systems。
    * x.Equals(y) 返回与 y.Equals(x) 相同的值。
    * 如果 x 和 y 都为 NaN,则 x.Equals(y) 返回 true。
    * 当且仅当 x.Equals(z) 返回 true 时,(x.Equals(y) && y.Equals(z)) 才返回 true。
    * 只要不修改 x 和 y 引用的对象,对 x.Equals(y) 的相继调用将返回相同的值。
    * x.Equals(null) 返回 false。

    ==:
    对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。
    
    对于 string  以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。
    对于 string  类型,==  比较字符串的值。

    示例:
       
void Main(string[] args)
                {
                        Console.WriteLine("==: " + ((2 + 2) == 4));                //true
                        Console.WriteLine("equals: " + ((2 + 2) == 4));        //true

                        object s = 1;
                        object t = 1;
                        Console.WriteLine("==: " + (s == t));                // false
                        Console.WriteLine("equals: " + (s == t));        // false

                        string a = "hello";
                        string b = String.Copy(a);
                        string c = "hello";

                        Console.WriteLine("==: " + (a == b));                // true
                        Console.WriteLine("equals: " + (a.Equals(b)));        //true

                        Console.WriteLine("==: " + ((object)a == (object)b));        //false    
                        Console.WriteLine("equals: " + ((object)a.Equals((object)b)));//true

                        Console.WriteLine("==: " + ((object)a == (object)c));        //true
                        Console.WriteLine("equals: " + ((object)a.Equals((object)c)));//true
                        Console.Read();
                }