C#Equals()和运算符==的区别

1.对于值类型

如果对象的值相等,则相等运算符==返回True,否则返回False


2.对于引用类型

equals方法比较的是两个对象指向的内存空间内容是不是相同。也就是比较两个引用类型是否是对同一个对象的引用,即两个对象的内容是否相等。


对于string类型,==比较字符串的值


对于引用类型,==操作符类似于比较的是文件夹的路径是否相同,而equals方法比较的是文件夹中的内容是不是一样。

using System;

namespace Equals和等号的区别
{
    class ClassPerson
    {
        private string name=null;
        public ClassPerson(string strname)
        {
            name = strname;
        }
        public string Name
        {
            set { name = value; }
            get { return name; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string s1 = "test";
            string s2 = "test";
            Console.WriteLine(s1 == s2);    //True
            Console.WriteLine(s1.Equals(s2));   //True

            object o1 = s1;
            object o2 = s2;
            Console.WriteLine(o1 == o2);//True
            Console.WriteLine(o1.Equals(o2));//True

            string s3 = new string(new char[] { 't', 'e', 's', 't' });
            string s4 = new string(new char[] { 't', 'e', 's', 't' });
            Console.WriteLine(s3 == s4);//True
            Console.WriteLine(s3.Equals(s4));//True

            object o3 = s3;
            object o4 = s4;
            Console.WriteLine(o3 == o4);//False
            Console.WriteLine(o3.Equals(o4));//True

            ClassPerson p1 = new ClassPerson("ltp");
            ClassPerson p2 = new ClassPerson("ltp");
            Console.WriteLine(p1 == p2);//False
            Console.WriteLine(p1.Equals(p2));//False

            ClassPerson p3 = new ClassPerson("ltp");
            ClassPerson p4 = p3;
            Console.WriteLine(p3 == p4);//True
            Console.WriteLine(p3.Equals(p4));//True
        }
    }
}

因为类型是存储在内存中的堆栈(以下简称),而引用类型的变量在中仅仅是存储引用类型变量的地址,而其本身则存储在中。

==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在中存储的地址是否相同,即中的内容是否相同。

equals操作表示的是两个变量是否是对同一个对象的引用,即中的内容是否相同。


堆和栈的区别是?

1、栈区(stack)―   由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

2、堆区(heap) ―   一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

堆和栈的区别可以用如下的比喻来看出: 

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 

使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章