11 区别对待==和Equals

无论是操作符"=="还是方法"Equals",都表示:

值类型,值相等则返回True;

引用类型,指向同一个对象即引用相等则返回True;

            object a = 1;
            object b = 1;
            Console.WriteLine(a == b);//False
            b = a;
            Console.WriteLine(a == b);//True
            Console.ReadLine();

1. ReferenceEquals, == , Equals 
Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等。

a) ReferenceEquals 
ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false。(因为Box以后的对象总是不同的)

b) ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。 
对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:

Int a = 100; 
Double b =100;

If(a == b) 
Console.WriteLine(“equal supports compare between different types!”);

上面这段程序将会输出: 
equal supports compare between different types!

而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如: 
Struct Userstruct1; 
Userstruct1 a; 
Userstruct1 b;

If(a == b) 
Console.WriteLine(“can == reach this far?”)

上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。

对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等。所以在应用中,对于 系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的运行结果。

c) Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。 

对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回 true,否则返回false。

对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时 候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。

            int i = 1;
            double j = 1;
            Console.WriteLine(i == j);//True
            Console.WriteLine(i.Equals(j));//False

 

 

    class Program
    {
        static void Main(string[] args)
        {
            TestChild m1 = new TestChild();
            Test m2 = new TestChild();
            Console.WriteLine(m1.a());
            Console.WriteLine(m2.a());

            Console.WriteLine(m1 == m2);//False
            Console.WriteLine(m1.Equals(m2));//False

            object m3 = 1;
            object m4 = 1;

            Console.WriteLine(m3 == m4);//False
            Console.WriteLine(m3.Equals(m4));//True

            int a3 = 1;
            int a4 = 1;

            Console.WriteLine(a3 == a4);//True
            Console.WriteLine(a3.Equals(a4));//True

            object m5 = "1";
            object m6 = "1";

            Console.WriteLine(m5 == m6);//True
            Console.WriteLine(m5.Equals(m6));//True

            Console.ReadKey();

        }
    }
    public class Test
    {
        public virtual int a(Test t)
        {
            return 1;
        }

        public int a()
        {
            return 4;
        }
    }

    public class TestChild : Test
    {
        public override int a(Test t)
        {
            return 2;
        }

        public int a()
        {
            return 3;
        }
    }

 

posted @ 2016-01-13 13:27  小-黑  阅读(132)  评论(0)    收藏  举报