C#中==与Equals方法的区别
2016-07-18 03:23
453 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Person { private string name; public string Name { get { return name; } set { name = value; } } public Person(string name) { this.name = name; } } class program { static void Main(string[] args) { string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); Console.WriteLine(a == b); Console.WriteLine(a.Equals(b)); object g = a; object h = b; Console.WriteLine(g == h); Console.WriteLine(g.Equals(h)); Person p1 = new Person("jia"); Person p2 = new Person("jia"); Console.WriteLine(p1 == p2); Console.WriteLine(p1.Equals(p2)); Person p3 = new Person("jia"); Person p4 = p3; Console.WriteLine(p3 == p4); Console.WriteLine(p3.Equals(p4)); Console.ReadLine(); } } }
输出结果:true ,true ,false ,true ,false ,false ,true ,true 。
总结如下:
1、对于值类型,==和equals等价,都是比较存储信息的内容。
2、对于引用类型,==比较的是引用类型在栈中的地址,equals方法则比较的是引用类型在托管堆中的存储信息的内容。
3、对于string类要特殊处理,它是一个内部已经处理好了equals方法和==的类,故==和equals等价,都是比较存储信息的内容。
4、对于一些自定义的类,我们有必要重载equals方法,否则它默认为基类的equals方法(基类没有重载Equals方法则为Object类中的Equals方法),他们的比较也为地址,而不是引用类型在托管堆中的存储信息的内容。
故我们就不难理解
以下输出了:
Person p1 = new Person("jia"); Person p2 = new Person("jia"); Console.WriteLine(p1 == p2);//输出False Console.WriteLine(p1.Equals(p2));//输出False
5、对于string我们有必要强调一下常量字符串与字符串变量的区别,请看一下例子:
// 常量字符串 string x = "should it matter"; //指向同一个地址,即所谓的常量池 string y = "should it matter"; object c = x; object d = y; Console.WriteLine(c == d);//输出True Console.WriteLine(c.Equals(d));//输出True // 字符串变量 string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });// 指向的地址不一样,是动态分配的 string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' }); object g = a; object h = b; Console.WriteLine(g == h);//输出False Console.WriteLine(g.Equals(h));//输出True
他们分配地址的方式不一样,string x = "should it matter"; 由于它的初始值是一个常量,所以其地址分配在托管堆上的静态存储区,即所谓的常量池,而楼主的string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o'}); 则不一样,它这是在托管堆上动态分配的地址。
相关文章推荐
- C#生成注册码
- C#多线程编程
- C#基础知识(六)——冒泡排序的书写
- [C#]插入排序
- C#WebService发布以及IIS发布
- 【知识积累】C#中结构体和类的区别
- 【总结】机房合作碎知识总结一
- C#的第五节课
- C#界面设计
- 【转载】.NET/C#-uploadify视频文件or大文件上传
- C#已解决问题集锦
- C#转义 Console.WriteLine("{0}, {{{1}}}", "ab", "xyz");
- C#操作MSMQ向本地消息队列发送和接收消息
- [C#]选择排序
- C# 中用stopwatch测试代码运行时间及递归比较
- C#静态类的使用[简单]
- C#桌面办公应用-工资管理系统系列九
- [c#基础]AutoResetEvent
- C# 6.0那些事
- [C#]冒泡排序