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

因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
  "==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
  "equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
    而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
    因此在上面的例子中,第一对输出 ,字符串a和字符串b的两个比较是相等的。
    对于 第二对输出 object g = a 和object h = b ,  在内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而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。

时间: 2024-10-13 00:02:35

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

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

Java中的equals()与==的区别

1 根类object中的equals()与==没有区别: 如普通类Person中: Person per1 = new Person("张三",20): Person per2 = new Person("张三",20): System.out.print(per1.equals(per2));的结果为true. 2 String类改写了Object的equals(); ==是指对内存地址的值进行比较 equals()是对字符串的内容进行比较 如:String st

Java中的equals和==的区别

java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个

J2SE快速进阶——Java中的equals和==的区别

我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型.equals和==都是用来比较数据与数据是否"相等". 基本数据类型的比较 基本数据类型之间的比较用"==",用来判断它们的值是否相等. 示例代码: public class Test{ public static void main(String[] args){ int i1=9; int i2=9; boolean b1=true; boolean b2=true; char c1='

C语言学习笔记 (002) - C++中引用和指针的区别(转载)

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const.volatile等等.见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用.见下图,所示引用的含义: 2.指针和引用的区别 首先,引用不可以为空,但指针可以为空.前面也说过了引用是对象的别名,引用为空--对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化.因此

HTTP返回码中301与302的区别 (转载)

一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:  301 redirect: 301 代表永久性转移(Permanently Moved). 302 redirect: 302 代表暂时性转移(Temporarily Moved ).  这是很官方的说法,那么它们的区别到底是什么呢? 二.现实中的差异 2.1.对于用户 301,302对用户来说没有区别,他们看到效果只是一个跳转,浏览器中旧的URL变成了新的URL.页面跳到了这个新的url指向的

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

SQL中select与set的区别-转载

下表列出 SET 与 SELECT 的区别   SELECT SET 同时对多个变量同时赋值时 支持 不支持 表达式返回多个值时 将返回的最后一个值赋给变量 出错 表达式未返回值时 变量保持原值 变量被赋null值 (1).同时对多个变量同时赋值时 declare @a varchar(128), @b varchar(128) SET @a='ABC',@b='EFG' GO --报错:消息 102,级别 15,状态 1,第 3 行 ',' 附近有语法错误. declare @a varcha