`
shirlly
  • 浏览: 1652588 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

c# equals与==的区别

    博客分类:
  • .NET
阅读更多
对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
    ==操作比较的是两个变量的值是否相等。
    equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
    对于值类型的比较,这里就不做描述了,下面讨论引用类型的比较:
首先我们看一段程序

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;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    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。
为什么会出现这个答案呢?因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
    equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
    而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
    因此在上面的例子中,字符串a和字符串b的两个比较是相等的。
    对于object g 和object h 时内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字符串a和b作这样的修改:
        string a="aa";
        string b="aa";
则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。
对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。
对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true。
如果我们对person的equals方法重写:
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;
        }

        public override bool Equals(object obj)
        {
            if (!(obj is Person))
                return false;
            Person per = (Person)obj;
            return this.Name == per.Name;
        }
    }
}

那么p1.equals(p2),就会返回true。

转自:http://www.cnblogs.com/jiahaipeng/archive/2008/04/11/1146316.html
分享到:
评论

相关推荐

    C#中的==运算符

    在String类型中,==运算符执行的结果与Equals方法的结果是一样的。这是因为,String类型提供了==运算符的重载。 下面是一个简单的示例代码: ```csharp class Program { static void Main(string[] args) { ...

    C#中的 == 和equals()区别浅析

    在C#编程语言中,`==`运算符和`Equals()`方法是两种常见的用于比较对象是否相等的方式,但它们之间存在重要的区别。本文将详细解释这两种比较方式的不同点。 首先,`==`运算符主要用于比较基本数据类型的值是否相等...

    C#基础:Equals()与运算符==的区别分析

    对于值类型,`Equals()`通常与`==`行为一致。但在引用类型中,如果不重写`Equals()`,默认的`Equals()`方法也是基于引用的比较,即检查两个对象是否指向内存中的同一位置。然而,如果一个类重写了`Equals()`,它可以...

    ==和equals的比较

    在 C# 编程语言中,`==` 和 `equals` 是两个常用的比较运算符,但它们之间有很大的区别。 堆和栈的区别 在理解 `==` 和 `equals` 之前,我们需要了解堆和栈的区别。堆是一种动态分配的内存区域,由程序员自己申请...

    浅析C#中的等号“==”和Equals

    1.“==”和Equals两个真的有关联吗?  对于“==”和Equals大多数网友都是这样总结的:  “==” 是比较两个变量的值相等。  Equals是比较两个变量是否指向同一个对象。  public class Person  {  public ...

    C# Equals 和 GetHashCode 方法重写

    ### C# Equals 和 GetHashCode 方法重写 在C#编程中,`Equals` 和 `GetHashCode` 方法是非常重要的成员方法,它们对于确保对象的正确比较以及高效地存储和检索对象至关重要。这两个方法通常需要在自定义类中进行...

    详解C#中==、Equals、ReferenceEquals的区别

    C#中Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等,对于相同的基本值类型,==和Equals()比较结果是一样的;由于ReferenceEquals()是判断两个对象的引用是否相等,对于值类型,因为每次判断...

    Equals和==的区别 公共变量和属性的区别小结

    在探讨编程语言C#中,有几个需要明确区分的概念:Equals和==运算符的差异,以及公共变量和属性的区别。在C#语言中,进行对象比较时经常会遇到这两个概念,它们在程序设计中扮演着重要的角色。 首先是Equals和==的...

    字符串比较之 “==”和 “equals”

    "=="和"equals()"是两种常用的字符串比较方法,但它们之间存在一定的区别和使用场景。这篇博客将深入探讨这两个方法的工作原理以及何时应该使用它们。 首先,"=="运算符在Java中主要用于比较基本类型变量的值,如...

    ==运算符和Equals()方法区别

    在C#语言中,`==`运算符和`Equals()`方法都是用来比较两个对象是否相等,但是它们之间存在着很大的区别。 对于值类型来说,`==`运算符和`Equals()`方法的行为是一致的,都会比较两个对象的值是否相等。例如,在上面...

    C#使用Equals()方法比较两个对象是否相等的方法

    在C#编程语言中,`Equals()`方法是一个用于比较对象是否相等的关键工具。这个方法在处理对象间的等价性判断时非常常见,特别是在需要确定两个变量或实例是否表示相同数据的情况下。`Equals()`方法是Object类的一个...

    C#中的Equals、RefrenceEquals和==的区别与联系

    C#中判断两个对象是否相等有Equals、RefrenceEquals和==三种,其中==为运算符,其它两个为方法,而Equals又有两种版本,一个是静态的,一个是虚拟的,虚拟的可以被实体类重写,静态的在方法体内也是调用虚拟的,如下...

    C#源代码-等号和Equals的区别.zip

    在C#编程语言中,等号(`=`)和`Equals`方法是两个常见的用于比较对象的方法,但它们之间存在着显著的区别。理解这些差异对于编写高效、无误的代码至关重要。 1. **等号(`=`):赋值运算符** 等号在C#中主要作为...

    C#中Equals和GetHashCode使用及区别

    "C#中的Equals和GetHashCode使用及区别" C#中的Equals和GetHashCode是两个非常重要的方法,它们在对象比较和哈希表中扮演着关键角色。今天,我们将详细介绍这两个方法的使用和区别。 Equals方法是用于比较两个对象...

Global site tag (gtag.js) - Google Analytics