当前位置: 首页 > 面试题库 >

C#中equal与==的区别

鲍驰
2023-03-14
本文向大家介绍C#中equal与==的区别相关面试题,主要包含被问及C#中equal与==的区别时的应答技巧和注意事项,需要的朋友参考一下

答:

C#中,判断相等有两种方式,一种是传统的==操作,一种是object提供的Equals方法。

二者的区别在于: 一、==操作符判断的是堆栈中的值,Equlas判断的是堆中的值 C#提供值类型和引用类型,值类型存储在栈上,故用==判断是直接判断其值是否相等,因为值类型不存在堆中的数据,因此值类型的Equals也是判断数据。即,对于值类型而言,==与Equals相同,均是判断其值是否相等。

对于引用类型而言,其栈中存储的是对象的地址,那么==就是比较两个地址是否相等,即是否指向同一个对象;Equals函数则是比较两个对象在堆中的数据是否一样,即两个引用类型是否是对同一个对象的引用。 二、String类型特殊 String类型虽然是引用类型,但是对String对象的赋值却按照值类型操作。 例如: String s1="hello"; String s2="hello"; 对s2初始化的时候,并没有重新开辟内存,而是直接将其地址指向s1的内容“hello”。这样一来,string类型虽然是引用类型,但是其==操作和Equals操作都是一样的,均比较值是否相等。 三、与GetHashCode()的关系 若两对象Equals相等,那么其GetHashCode()必定相等;但是反过来,若GetHashCode()相等,那么这两个对象Equals方法比较结果不一定相同。(为了获取最佳性能,hash函数为对象内容生成的数字是随机分布的,这就意味着,内容不同的对象,有可能生成的数字是一样的,但可以认为这种概率非常小) 下面示例说明:

 

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

namespace ConsoleApplication1
{
    class People
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public People(string name)
        {
            this.name = name;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
           string a = "hello";
            string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            Console.WriteLine(a == b); //True
            Console.WriteLine(a.Equals(b));//True
            Console.WriteLine("*********");
            int m = 3;
            int n = 3;
            Console.WriteLine(n == m);//True
            Console.WriteLine(n.Equals(m));//True
            Console.WriteLine("*********");
            object g = a;
            object h = b;
            Console.WriteLine(g == h);//False
            Console.WriteLine(g.Equals(h));//True
            Console.WriteLine(g.GetHashCode() + "   " + h.GetHashCode()); //1025947313   1025947313
            Console.WriteLine("*********");
            People p1 = new People("Jimmy");
            People p2 = new People("Jimmy");
            Console.WriteLine(p1 == p2); //False
            Console.WriteLine(p1.Equals(p2)); //False
            Console.WriteLine(p1.GetHashCode() + "  " + p2.GetHashCode());//43495525  55915408
            Console.WriteLine("*********");
            People p3 = new People("Jimmy");
            People p4 = p3;
            Console.WriteLine(p3 == p4);//True
            Console.WriteLine(p3.Equals(p4));//True

        }
    }
}

在C#中,string 类型的特点有: (1)属于基本数据类型; (2)是引用类型; (3)只读; (4) string a="1123"; string b="1123"; 那么a和b指向同一个内存地址; 但是并非2个相同值相等的字符串就对应同一个内存地址;

 类似资料:
  • 本文向大家介绍c#中(&&,||)与(&,|)的区别详解,包括了c#中(&&,||)与(&,|)的区别详解的使用技巧和注意事项,需要的朋友参考一下 对于(&&,||),运算的对象是逻辑值,也就是True/False &&相当与中文的并且,||相当于中文的或者 。(叫做逻辑运算符又叫短路运算符) 运算结果只有下列四种情况。 True  && True  = True    (左边为true,再验证右

  • 该方法返回一个布尔值,表示一个字符串是否等于另一个字符串。 如果字符串相等,则返回值true,否则返回false值。 语法 (Syntax) equal(str1,str2) 参数 (Parameters) str1,str2 - 需要比较的2个字符串。 返回值 (Return Value) 如果2个字符串相等,则返回true值,否则返回false值。 例如 (For example) -mod

  • 本文向大家介绍C#中Html.RenderPartial与Html.RenderAction的区别分析,包括了C#中Html.RenderPartial与Html.RenderAction的区别分析的使用技巧和注意事项,需要的朋友参考一下 本文较为详细的讲解了C#中Html.RenderPartial与Html.RenderAction的区别,具体分析如下: Html.RenderPartial与

  • 本文向大家介绍C#中String与string的区别分析,包括了C#中String与string的区别分析的使用技巧和注意事项,需要的朋友参考一下 本文实例展示了C#程序设计中String与string的区别,对于C#初学者来说有很好的参考借鉴价值。具体如下: 一、区别分析: String:类,System.String string:类型,变量 两者本质上没有任何区别,都是System.Stri

  • 本文向大家介绍C#中is与as的区别分析,包括了C#中is与as的区别分析的使用技巧和注意事项,需要的朋友参考一下 本文实例分析了C#中is与as的区别,分享给大家供大家参考。具体分析如下: 一、C#类型的转换 在c#中类型的转换分两种:显式和隐式,基本的规则如下: 1、基类对象转化为子类对象,必须显式转换,规则:(类型名) 对象。 2、值类型和引用类型的转换采用装箱(boxing)或拆箱(unb

  • 本文向大家介绍浅析C#中结构与类的区别,包括了浅析C#中结构与类的区别的使用技巧和注意事项,需要的朋友参考一下 一、    结构:值类型,存储在堆栈中,位于计算机的内存逻辑区域中     类   :引用类型,存储在堆中,位于计算机内存的不同逻辑位置 二、   较小的数据使用结构;   将一个结构值传递到方法时,传递的是整个数据结构;   传递一个类,实际上是将引用传递到对象,即只有内存地址;