栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

C#中的疑惑点 ==、Equals、ReferenceEquals

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#中的疑惑点 ==、Equals、ReferenceEquals

本文旨在把C#中的 ==、Equals、ReferenceEquals 三种比较方法整的明明白白。

一、==操作符可以用于比较两个对象

1、值类型的比较,比较数值的大小,不同类型时也可比较。

(1)同种类型

新建控制台应用程序

  

  static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            int v1 = 1;
            int v2 = 1;
            Console.WriteLine("值类型同类型的比较:" + (v1 == v2).ToString());

            Console.ReadKey();
        }

运行结果:

(2)不同类型

 static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            int v3 = 1;
            double d3 = 1;
            Console.WriteLine("值类型不同类型的比较:" + (v3 == d3).ToString());

            Console.ReadKey();
        }

运行结果:

 2、引用类型的比较,比较对象的引用地址是否一致,但是string类型较特殊,比较字符串内容是否相等。

(1)一般引用类型

 添加Students类

 public class Student
    {
        public int Id { get; set; }

        public string Name { get; set; }
    }

修改Main方法

 static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            Student student1 = new Student()
            {
                Id = 1,
                Name = "qqq"
            };

            Student student2 = new Student()
            {
                Id = 1,
                Name = "qqq"
            };

            Console.WriteLine("引用类型的比较new的对象:" + (student1 == student2).ToString());

            Student student3 = student1;

            Console.WriteLine("引用类型的比较赋值的对象:" + (student1 == student3).ToString());

            Console.ReadKey();
        }

运行效果:

 (2)string类型使用==比较时,比较的是string字符串是否相同,但两个比较的字符串引用地址不一定相同。

  static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            string str1 = "hello";
            string str2 = "hello";

            string str3 = "he";
            string str4 = "llo";
            string str5 = str3 + str4;

            Console.WriteLine("str1==str2结果:" + (str1 == str2).ToString());
            Console.WriteLine("str1==str5结果:" + (str1 == str5).ToString());

            Console.WriteLine("str1、str2引用地址比较结果:" + object.ReferenceEquals(str1,str2).ToString());
            Console.WriteLine("str1、str5引用地址比较结果:" + object.ReferenceEquals(str1,str5).ToString());

            Console.ReadKey();
        }

运行结果:

 二、Equals方法比较两个对象

1、值类型的比较

(1)相同类型的值类型,比较值的大小

  static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            int v1 = 1;
            int v2 = 1;

            Console.WriteLine("相同类型的值类型Equals比较:" + v1.Equals(v2));

            Console.ReadKey();
        }

运行结果:

 (2)不同类型的值类型,Equals后的值类型可以隐式转换为Equals前的值类型,则数值相等时返回true,反之数值相等时返回false

  static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            int v1 = 1;
            double v2 = 1;
            short v3 = 1;

            Console.WriteLine("不同类型的值类型Equals比较:" + v1.Equals(v2));
            Console.WriteLine("不同类型的值类型Equals比较,int类型隐式转换为double:" + v2.Equals(v1));
            Console.WriteLine("不同类型的值类型Equals比较,short类型隐式转换为int:" + v1.Equals(v3));

            Console.ReadKey();
        }

运行结果:

 2、引用类型的比较。

(1)一般引用类型,Equals比较的是引用类型的地址
 

 static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            Student student1 = new Student()
            {
                Id = 1,
                Name = "qqq"
            };
            Student student2 = new Student()
            {
                Id = 1,
                Name = "qqq"
            };
            Console.WriteLine("Equals比较引用类型new对象"+student1.Equals(student2));

            Student student3 = student1;
            Console.WriteLine("Equals比较引用类型赋值对象" + student1.Equals(student3));

            Console.ReadKey();
        }

运行结果:

 (2)Equals比较string类型。比较string类型的字符串内容是否相同,字符串内容相同引用地址不同的字符串Equals方法返回True。

  static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            string str1 = "hello";
            string str2 = "hello";

            string str3 = "he";
            string str4 = "llo";
            string str5 = str3 + str4;

            Console.WriteLine("Equals比较string类型str1、str2" + str1.Equals(str2));
            Console.WriteLine("Equals比较string类型str1、str5" + str1.Equals(str5));

            Console.WriteLine("比较string类型str1、str2的引用地址" + object.ReferenceEquals(str1,str2));
            Console.WriteLine("比较string类型str1、str5的引用地址" + object.ReferenceEquals(str1, str5));

            Console.ReadKey();
        }

运行结果:

 三、ReferenceEquals 比较两个对象

1、ReferenceEquals比较值类型,值类型的引用地址都不相同

 static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            int v1 = 1;
            int v2 = 1;
            int v3 = v1;
            double v4 = 1;

            Console.WriteLine("同类型的值类型引用地址:" + object.ReferenceEquals(v1, v2));
            Console.WriteLine("同类型的值类型复制后引用地址:" + object.ReferenceEquals(v1, v3));
            Console.WriteLine("不同类型的值类型引用地址:" + object.ReferenceEquals(v1, v4));

            Console.ReadKey();
        }

运行结果:

 2、ReferenceEquals比较引用类型,比较的是引用类型对象的引用地址是否相同。

(1)一般定义的对象,比较的是对象的引用地址

 static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            Student student1 = new Student()
            {
                Id = 1,
                Name = "qqq"
            };
            Student student2 = new Student()
            {
                Id = 1,
                Name = "qqq"
            };
            Console.WriteLine("引用类型的比较new的对象:" + object.ReferenceEquals(student1,student2));

            Student student3 = student1;
            Console.WriteLine("引用类型的比较赋值的对象:" + object.ReferenceEquals(student1, student3));

            Console.ReadKey();
        }

运行结果:

 (2)ReferenceEquals比较string类型,比较的是字符串的地址。

  static void Main(string[] args)
        {
            Console.Title = "C#的等于";

            string str1 = "hello";
            string str2 = "hello";

            string str3 = "he";
            string str4 = "llo";
            string str5 = str3 + str4;

            Console.WriteLine("ReferenceEquals比较str1、str2:" + object.ReferenceEquals(str1, str2));
            Console.WriteLine("ReferenceEquals比较str1、str5:" + object.ReferenceEquals(str1, str5));

            Console.ReadKey();
        }

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906159.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号