C#中==与Equals方法的区别

usingSystem;
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方法则比较的是引用类型在托管堆中的存储信息的内容。www.2cto.com
    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我们有必要强调一下常量字符串与字符串变量的区别,请看一下例子:
// 常量字符串
stringx = "should it matter"; //指向同一个地址,即所谓的常量池
stringy = "should it matter";
object c = x;
object d = y;
Console.WriteLine(c == d);//输出True
Console.WriteLine(c.Equals(d));//输出True
// 字符串变量
stringa = new string(new char[] { ‘h‘, ‘e‘, ‘l‘, ‘l‘, ‘o‘ });// 指向的地址不一样,是动态分配的
stringb = 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‘}); 则不一样,它这是在托管堆上动态分配的地址。
  
摘自  菜-鸟

时间: 2024-10-17 13:53:26

C#中==与Equals方法的区别的相关文章

Java中“==”与equals方法的区别

1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:String类对equals进行了重写:1)若是同一个对象,返回true: 2)若不是,则比较它们的值,值相同,返回true 重写代码: public boolean equals(Object anObject) { if (this == anObject) { return true; } if

java中 == 和 equals()方法的区别

参考博客: 1.当要判断两个对象是否是相同时,可以重写equals()方法.....参考:   http://www.2cto.com/kf/201408/327873.html 2.具体 : http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html 3.http://blog.csdn.net/xcysuccess3/article/details/6557771 主要注意的地方:String Integer等类的equal

java中‘==’和‘equals()’方法的有趣探索

这两天在看周志明的<深入理解java虚拟机>,受益颇多,根据书中的启示,对java中'=='和'equals()'方法的区别做了一些探索. 首先,为了更快地让进入状态,我们先来所几个判断题,例程如下,请判断各个System.out.println()输出的结果. <pre name="code" class="java"> public static void main(String[] args) { Integer a =1; Integ

【转】彻底弄懂Java中的equals()方法以及与&quot;==&quot;的区别

彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差.所以,我决定花费时间把equals()和“==”的功能彻底弄懂,前事不忘后事之师嘛,分享给大家,希望对大家理解equals()和“==”的功能有所帮助. 二.分析探索解决问题的方法:1.Object 中的equals()方法: (1)通过查找API,说明如下: equalspublic boolean equ

c#中 ==与equals有什么区别(转载)

c#中 ==与equals有什么区别 对于值类型.引用类型来说比较过程怎样的? using System;using System.Collections.Generic;using System.Text; namespace ConsoleApplication1{    class Person    {        private string name; public string Name        {            get { return name; }      

java中==与equal()方法的区别

java中==与equal()方法的区别 java中==比较的是地址,equal比较的是值. 示例: 1 2 3 4 Integer a1 = new Integer(456);//实例化一个对象 Integer a2 = new Integer(456);//实例化一个对象 System.out.println(a1.equals(a2));//这里比较的是值,都是456,结果是true System.out.println(a1==a2);//这里比较的是地址,因为是2个对象,所以地址不同,

重写object类中的equals方法

package equalsdemo; /* * 重写object中的equals方法 */ public class equalsdemo { public static void main(String[] args) { person p1 = new person("zhangsan",54); person p2 = new person("zhangsan",54); if (p1.equals(p2)) { System.out.println(&qu

JAVA中复写equals方法

一般说来,所有类都应该复写Object中的equals方法.步骤大概分三步: 1) 判断两个对象地址是否一致 2)判断第二个对象是否为同一个子类实例 3)判断内容是否一致 class Person { public int age; public String name; public Person(int age, String name) { this.age = age; this.name = name; } public boolean equals(Object obj) { //第

js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别

__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性.(据说和一个对象的attr类似,比如dom对象中) prototype:每个构造函数都有一个prototype对象,这个对象指向该构造函数的原型. 对象自身属性方法和原型中的属性方法的区别: 对象自身的属性和方法只对该对象有效,而原型链中的属性方法对所有实例有效. 例子: function bas