C# 中 ==和equals的区别

不想说太多,直接上代码,这两个就没什么联系,有自己独立的规则。比较其实不利于记忆。

下面是测试代码

            Console.WriteLine("--equals和==的区别--");
            Console.WriteLine("1、对于值类型的数据");
            Console.WriteLine();
            Console.WriteLine("1.1、类型和数学上的值都相同的数");
            Console.WriteLine($"(int)1 == (int)1 的结果是:{(int)1 == (int)1}");
            Console.WriteLine($"(int)1).Equals((int)1) 的结果是:{((int)1).Equals((int)1)}");

            Console.WriteLine("1.2、对于类型不同但是数学上值相同的数");
            Console.WriteLine($"(int)1 == (long)1 的结果是:{(int)1 == (long)1}");
            Console.WriteLine($"(int)1 == (double)1 的结果是:{(int)1 == (double)1}");
            Console.WriteLine($"(int)1 == (double)1.0 的结果是:{(int)1 == (double)1.0}");
            Console.WriteLine($"(int)1 == (decimal)1 的结果是:{(int)1 == (decimal)1}");
            Console.WriteLine($"(int)1 == (decimal)1.0 的结果是:{(int)1 == (decimal)1.0}");
            Console.WriteLine($"((int)1).Equals((long)1 的结果是:{((int)1).Equals((long)1)}");
            Console.WriteLine();

            Console.WriteLine("2、对于引用类型的数据");
            Console.WriteLine();
            Console.WriteLine("2.1、在1.1的基础上转化为object再比较");
            Console.WriteLine($"(object)(int)1 == (object)(int)1 的结果是:{(object)(int)1 == (object)(int)1}");
            Console.WriteLine($"((object)(int)1).Equals((object)(int)1 的结果是:{((object)(int)1).Equals((object)(int)1)}");
            Console.WriteLine();

            Console.WriteLine("2.2、在1.2的基础上转化为object再比较");
            Console.WriteLine($"(object)(int)1 == (object)(long)1 的结果是:{(object)(int)1 == (object)(long)1}");
            Console.WriteLine($"((object)(int)1).Equals((object)(long)1 的结果是:{((object)(int)1).Equals((object)(long)1)}");
            Console.WriteLine();
            Console.ReadKey();

打印如下:

--equals和==的区别--
1、对于值类型的数据

1.1、类型和数学上的值都相同的数
(int)1 == (int)1 的结果是:True
(int)1).Equals((int)1) 的结果是:True
1.2、对于类型不同但是数学上值相同的数
(int)1 == (long)1 的结果是:True
(int)1 == (double)1 的结果是:True
(int)1 == (double)1.0 的结果是:True
(int)1 == (decimal)1 的结果是:True
(int)1 == (decimal)1.0 的结果是:True
((int)1).Equals((long)1 的结果是:False

2、对于引用类型的数据

2.1、在1.1的基础上转化为object再比较
(object)(int)1 == (object)(int)1 的结果是:False
((object)(int)1).Equals((object)(int)1 的结果是:True

2.2、在1.2的基础上转化为object再比较
(object)(int)1 == (object)(long)1 的结果是:False
((object)(int)1).Equals((object)(long)1 的结果是:False

还是给个说明吧:

Equals具体的用发应该看类型自己的实现。

对于int型的比较代码是这样定义的:如果比较的是int型,返回使用==比较的结果;如果不是,先判断是不是int型,不是直接返回false,是再返回使用==比较的结果。

int 的Equals方法只支持int和object两种,如果传入其他类型,会自动转化为object。如((int)1).Equals((long)1 等价于 ((int)1).Equals((object)(long)1

        [__DynamicallyInvokable]
        public override bool Equals(object obj)
        {
            if (!(obj is int))
            {
                return false;
            }
            return this == (int)obj;
        }

        [NonVersionable]
        [__DynamicallyInvokable]
        public bool Equals(int obj)
        {
            return this == obj;
        }

//    // 摘要:    //     表示 32 位有符号整数。 若要浏览此类型的.NET Framework 源代码,请参阅 Reference Source。    [ComVisible(true)]    public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32>    {        //        // 摘要:        //     表示 System.Int32 的最大可能值。 此字段为常数。        public const Int32 MaxValue = 2147483647;        //        // 摘要:        //     表示 System.Int32 的最小可能值。 此字段为常数。        public const Int32 MinValue = -2147483648;
        //        // 摘要:        //     将指定样式和区域性特定格式的数字的字符串表示形式转换为它的等效 32 位有符号整数。        //        // 参数:        //   s:        //     包含要转换的数字的字符串。        //        //   style:        //     枚举值的按位组合,用于指示可出现在 s 中的样式元素。 要指定的一个典型值为 System.Globalization.NumberStyles.Integer。        //        //   provider:        //     一个对象,用于提供有关 s 格式的区域性特定信息。        //        // 返回结果:        //     与 s 中指定的数字等效的 32 位带符号整数。        //        // 异常:        //   T:System.ArgumentNullException:        //     s 为 null。        //        //   T:System.ArgumentException:        //     style 不是 System.Globalization.NumberStyles 值。 - 或 - style 不是 System.Globalization.NumberStyles.AllowHexSpecifier        //     和 System.Globalization.NumberStyles.HexNumber 值的组合。        //        //   T:System.FormatException:        //     s 的格式不符合 style。        //        //   T:System.OverflowException:        //     s 表示一个小于 System.Int32.MinValue 或大于 System.Int32.MaxValue 的数字。 - 或 - s 包含非零的小数位。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public static Int32 Parse(string s, NumberStyles style, IFormatProvider provider);        //        // 摘要:        //     将指定的区域性特定格式的数字的字符串表示形式转换为它的等效 32 位有符号整数。        //        // 参数:        //   s:        //     包含要转换的数字的字符串。        //        //   provider:        //     一个对象,提供有关 s 的区域性特定格式设置信息。        //        // 返回结果:        //     与 s 中指定的数字等效的 32 位带符号整数。        //        // 异常:        //   T:System.ArgumentNullException:        //     s 为 null。        //        //   T:System.FormatException:        //     s 的格式不正确。        //        //   T:System.OverflowException:        //     s 表示一个小于 System.Int32.MinValue 或大于 System.Int32.MaxValue 的数字。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public static Int32 Parse(string s, IFormatProvider provider);        //        // 摘要:        //     将数字的字符串表示形式转换为它的等效 32 位有符号整数。        //        // 参数:        //   s:        //     包含要转换的数字的字符串。        //        // 返回结果:        //     与 s 中包含的数字等效的 32 位有符号整数。        //        // 异常:        //   T:System.ArgumentNullException:        //     s 为 null。        //        //   T:System.FormatException:        //     s 的格式不正确。        //        //   T:System.OverflowException:        //     s 表示一个小于 System.Int32.MinValue 或大于 System.Int32.MaxValue 的数字。        public static Int32 Parse(string s);        //        // 摘要:        //     将指定样式的数字的字符串表示形式转换为它的等效 32 位有符号整数。        //        // 参数:        //   s:        //     包含要转换的数字的字符串。        //        //   style:        //     枚举值的按位组合,用于指示可出现在 s 中的样式元素。 要指定的一个典型值为 System.Globalization.NumberStyles.Integer。        //        // 返回结果:        //     与 s 中指定的数字等效的 32 位带符号整数。        //        // 异常:        //   T:System.ArgumentNullException:        //     s 为 null。        //        //   T:System.ArgumentException:        //     style 不是 System.Globalization.NumberStyles 值。 - 或 - style 不是 System.Globalization.NumberStyles.AllowHexSpecifier        //     和 System.Globalization.NumberStyles.HexNumber 值的组合。        //        //   T:System.FormatException:        //     s 的格式不符合 style。        //        //   T:System.OverflowException:        //     s 表示一个小于 System.Int32.MinValue 或大于 System.Int32.MaxValue 的数字。 - 或 - s 包含非零的小数位。        public static Int32 Parse(string s, NumberStyles style);        //        // 摘要:        //     将数字的字符串表示形式转换为它的等效 32 位有符号整数。 一个指示转换是否成功的返回值。        //        // 参数:        //   s:        //     包含要转换的数字的字符串。        //        //   result:        //     当此方法返回时,如果转换成功,则包含与 s 中所包含的数字等效的 32 位无符号整数值;如果转换失败,则包含零。 如果 s 参数为 null 或 System.String.Empty、格式不正确,或者表示的数字小于        //     System.Int32.MinValue 或大于 System.Int32.MaxValue,则转换失败。 此参数未经初始化即进行传递;最初在 result        //     中提供的任何值都会被覆盖。        //        // 返回结果:        //     如果 true 成功转换,则为 s;否则为 false。        public static bool TryParse(string s, out Int32 result);        //        // 摘要:        //     将指定样式和区域性特定格式的数字的字符串表示形式转换为它的等效 32 位有符号整数。 一个指示转换是否成功的返回值。        //        // 参数:        //   s:        //     包含要转换的数字的字符串。 该字符串使用由 style 指定的样式来进行解释。        //        //   style:        //     枚举值的按位组合,用于指示可出现在 s 中的样式元素。 要指定的一个典型值为 System.Globalization.NumberStyles.Integer。        //        //   provider:        //     一个对象,提供有关 s 的区域性特定格式设置信息。        //        //   result:        //     当此方法返回时,如果转换成功,则包含与 s 中所包含的数字等效的 32 位无符号整数值;如果转换失败,则包含零。 如果 s 参数为 null 或 System.String.Empty、格式不符合        //     style,或者表示的数字小于 System.Int32.MinValue 或大于 System.Int32.MaxValue,则转换失败。 此参数未经初始化即进行传递;最初在        //     result 中提供的任何值都会被覆盖。        //        // 返回结果:        //     如果 true 成功转换,则为 s;否则为 false。        //        // 异常:        //   T:System.ArgumentException:        //     style 不是 System.Globalization.NumberStyles 值。 - 或 - style 不是 System.Globalization.NumberStyles.AllowHexSpecifier        //     和 System.Globalization.NumberStyles.HexNumber 值的组合。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out Int32 result);        //        // 摘要:        //     将此实例与指定对象进行比较并返回一个对二者的相对值的指示。        //        // 参数:        //   value:        //     要比较的对象,或为 null。        //        // 返回结果:        //     一个带符号数字,指示此实例和 value 的相对值。 返回值 描述 小于零 此实例小于 value。 零 此实例等于 value。 大于零 此实例大于 value。        //     - 或 - value 为 null。        //        // 异常:        //   T:System.ArgumentException:        //     value 不是 System.Int32。        public Int32 CompareTo(object value);        //        // 摘要:        //     将此实例与指定的 32 位有符号整数进行比较并返回对其相对值的指示。        //        // 参数:        //   value:        //     要比较的整数。        //        // 返回结果:        //     一个带符号数字,指示此实例和 value 的相对值。 返回值 描述 小于零 此实例小于 value。 零 此实例等于 value。 大于零 此实例大于 value。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public Int32 CompareTo(Int32 value);        //        // 摘要:        //     返回一个值,该值指示此实例是否等于指定的对象。        //        // 参数:        //   obj:        //     与此实例进行比较的对象。        //        // 返回结果:        //     如果 true 是 obj 的实例并且等于此实例的值,则为 System.Int32;否则为 false。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public override bool Equals(object obj);        //        // 摘要:        //     返回一个值,该值指示此实例是否等于指定的 System.Int32 值。        //        // 参数:        //   obj:        //     要与此实例进行比较的 System.Int32 值。        //        // 返回结果:        //     如果 true 的值与此实例相同,则为 obj;否则为 false。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public bool Equals(Int32 obj);        //        // 摘要:        //     返回此实例的哈希代码。        //        // 返回结果:        //     32 位有符号整数哈希代码。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public override Int32 GetHashCode();        //        // 摘要:        //     返回值类型 System.TypeCode 的 System.Int32。        //        // 返回结果:        //     枚举常数 System.TypeCode.Int32。        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public TypeCode GetTypeCode();        //        // 摘要:        //     使用指定的区域性特定格式信息,将此实例的数值转换为它的等效字符串表示形式。        //        // 参数:        //   provider:        //     一个提供区域性特定的格式设置信息的对象。        //        // 返回结果:        //     此实例的值的字符串表示形式,由 provider 指定。        [SecuritySafeCritical]        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public string ToString(IFormatProvider provider);        //        // 摘要:        //     将此实例的数值转换为其等效的字符串表示形式。        //        // 返回结果:        //     此实例的值的字符串表示形式,由减号(如果值为负)和没有前导零的从 0 到 9 的数字序列组成。        [SecuritySafeCritical]        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public override string ToString();        //        // 摘要:        //     使用指定的格式和区域性特定格式信息,将此实例的数值转换为它的等效字符串表示形式。        //        // 参数:        //   format:        //     标准或自定义的数值格式字符串。        //        //   provider:        //     一个提供区域性特定的格式设置信息的对象。        //        // 返回结果:        //     此实例的值的字符串表示形式,由 format 和 provider 指定。        //        // 异常:        //   T:System.FormatException:        //     format 无效或不受支持。        [SecuritySafeCritical]        public string ToString(string format, IFormatProvider provider);        //        // 摘要:        //     使用指定的格式,将此实例的数值转换为它的等效字符串表示形式。        //        // 参数:        //   format:        //     标准或自定义的数值格式字符串。        //        // 返回结果:        //     此实例的值的字符串表示形式,由 format 指定。        //        // 异常:        //   T:System.FormatException:        //     format 无效或不受支持。        [SecuritySafeCritical]        [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]        public string ToString(string format);    }

原文地址:https://www.cnblogs.com/tanl/p/10953670.html

时间: 2024-10-14 10:42:06

C# 中 ==和equals的区别的相关文章

java中==与equals的区别

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同. ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为true时,==不一定为true: 一.String中的equals和== 1. public

java 中 “==” 和 equals 的区别

在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就

C#中 ==与equals的区别

using System; internal class Person { public Person(string name) { Name = name; } public string Name { get; set; } } internal class Program { private static void Main() { var a = new string(new[] {'h', 'e', 'l', 'l', 'o'}); var b = new string(new[] {

java中==和equals的区别详解

分析前基础了解: 一)JVM把内存划分成两种:一种是栈内存,一种是堆内存. ①在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配. ②当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用. ③堆内存用来存放由new创建的对象(包括由基本类型包装起来的类:Integer.String.Double,实际上每个基本类型都有他的包装类)和数组. 二)Objec

Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提高查询速度.(HashMap,HashSet等

java中== 和 .equals()的区别

在java中,我们用来比较两个数据类型是否一样的时候,通常会用到 == 和 .equals(),然而这两者有什么区别呢.下面我们通过一些例子来看一下. package test; public class test { public static void main(String[] args) { // TODO Auto-generated method stub String a = "1"; String b = "1"; //int a = 1; //in

java 中 ==和equals 的区别

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

[转]Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: [java] view plain copy public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提

Java中==与equals的区别及理解

区别: “==” 比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致.(引用类型) 如果两个对象的引用相同时(指向同一对象时),“==”操作符返回true,否则返回flase. 注:如果有对内存分配及变量存储位置(堆.栈.方法区常量池.方法区静态区)感兴趣的可以去看看这篇博客,里面写的很详细.对我还在学基础的人来说帮助很大,理解了很多内容,还有待消化. equals方法是由Object类提供的,可以由子类来进行重写 Object类默认的实现如下