首页 > 编程语言 >C# 对象比较

C# 对象比较

时间:2023-09-14 21:11:06浏览次数:29  
标签:Console Person C# Equals 对象 WriteLine zsCopy 比较 zs

1.ReferenceEquals(object o1, object o2):

  • 静态方法:比较两个对象的引用,引用相同返回true,否则返回false,同为null是返回true;ReferenceEquals进行值类型比较时总是返回false,因为两个值类型需要分别装箱到对象中,是不同的引用 ;
  • 从名称中便可知它用来比较两者是否是相同的引用,我们也永远不应该去重写该方法。
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs; //ReferenceEquals比较两个对象的引用,同为null是返回true 
Console.WriteLine("ReferenceEquals(zs, ls) : " + ReferenceEquals(zs, ls)); // False
Console.WriteLine("ReferenceEquals(zs, zsCopy) : " + ReferenceEquals(zs, zsCopy)); //True
Console.WriteLine("ReferenceEquals(ls, zsCopy) : " + ReferenceEquals(ls, zsCopy)); //Fasle
Console.WriteLine("ReferenceEquals(null, null) : " + ReferenceEquals(null, null)); //True
Console.WriteLine("ReferenceEquals(zs, null) : " + ReferenceEquals(zs, null)); //False
Console.WriteLine("ReferenceEquals(1, 1) : " + ReferenceEquals(1, 1)); //False

.Net源代码为:

2.Equals(object o):

  • 虚方法:比较两个对象的引用,由于是虚方法所以可以在自己的类中重写它,按值来比较对象
  • 重写Equals应该遵循的原则:自反性、对称性、传递性。即:a=a;若a=b,则b=a;若a=b,b=c,则a=c;另外两个对象要么相等要不不等,所以该方法不应该抛出异常****;
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs; //虚拟Equals方法,比较引用,可以重写比较值 
Console.WriteLine("zs.Equals(ls) : " + zs.Equals(ls)); //Fasle
Console.WriteLine("zs.Equals(zsCopy) : " + zs.Equals(zsCopy)); //True
Console.WriteLine("ls.Equals(zsCopy) : " + ls.Equals(zsCopy)); //False
Console.WriteLine("zs.Equals(null) : " + zs.Equals(null)); //False
Console.WriteLine("1.Equals(1) : " + 1.Equals(1)); //True

.Net源代码为:

3.Equals(object o1, object o2):

  • 静态方法:比较两个对象的引用,先判断两个对象是否为空,如果都不为空,则调用虚拟Equals方法;
Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs; //静态Equals方法先比较两个对象是否为空,如果都不为空,则调用虚拟Equals方法 
Console.WriteLine("Person.Equals(zs, ls) : " + Person.Equals(zs, ls)); //False
Console.WriteLine("Person.Equals(zs, zsCopy) : " + Person.Equals(zs, zsCopy)); //True
Console.WriteLine("Person.Equals(ls, zsCopy) : " + Person.Equals(ls, zsCopy)); //False
Console.WriteLine("Person.Equals(null, null) : " + Person.Equals(null, null)); //True
Console.WriteLine("Person.Equals(zs, null) : " + Person.Equals(zs, null)); //Fasle
Console.WriteLine("Person.Equals(1, 1) : " + Person.Equals(1, 1)); //True

.Net源代码为:

4.object1 == object2:

  • 比较运算符:可以重写;****对于引用类型,默认是比较引用的(System.String除外)来源,对于值类型默认比较值;

  • 对于自定义的结构,如果不显示重载operator方法,则无法使用。

    由于在C#中要求比较运算符必须成对重载,重载==运算符的同时也必须重载!=运算符,否则也会产生编译错误。

    如果要重载的话,运算符 "=="、"!=" 与 Equals方法、GetHashCode方法应该同时被重载,因为他们应该保持同样的相等逻辑。但不要再 == 中调用Equals,最好是在Equals中调用 == 。

Person zs = new Person("ZhangSan",28);
Person ls = new Person("LiSi",20);
Person zsCopy = zs;
String str1 = "Hello";
String str2 = "Hello";
String str3 = str1; //比较运算符比较引用,可以重写 
Console.WriteLine("zs == ls : " + (zs == ls)); //False
Console.WriteLine("zs == zsCopy : " + (zs == zsCopy)); //True
Console.WriteLine("ls == zsCopy : " + (ls == zsCopy)); //False
Console.WriteLine("zs == null : " + (zs == null)); //False
Console.WriteLine("1 == 1 : " + (1 == 1)); //True
Console.WriteLine("str1 == str2 :" + (str1 == str2));//True
Console.WriteLine("str1 == str3 :" + (str1 == str3));//True
Console.WriteLine("str2 == str3 :" + (str2 == str3));//True

Equals(object o)与==的区别    

  1. ==操作符判断的是堆栈中的值,Equlas判断的是堆中的值。

  2. C#提供值类型和引用类型:

  • 值类型存储在栈上,故用 == 判断是直接判断其值是否相等,因为值类型不存在堆中的数据,因此值类型的Equals也是判断数据。即,对于值类型而言,== 与Equals相同,均是判断其值是否相等。
  • 对于引用类型而言,其栈中存储的是对象的地址,那么 == 就是比较两个地址是否相等,即是否指向同一个对象;Equals则是比较两个对象在堆中的数据是否一样,即两个引用类型是否是对同一个对象的引用。

3. String类型特殊:

  • String类型虽然是引用类型,但是对String对象的赋值却按照值类型操作
  • 对str2初始化的时候,并没有重新开辟内存,而是直接将其地址指向str1的内容“hello”。这样一来,string类型虽然是引用类型,但是其==操作和Equals操作都是一样的,均比较值是否相等。

4. 与GetHashCode()的关系

  • 若两对象Equals相等,那么其GetHashCode()必定相等;但是反过来,若GetHashCode()相等,那么这两个对象Equals方法比较结果不一定相同。(为了获取最佳性能,hash函数为对象内容生成的数字是随机分布的,这就意味着,内容不同的对象,有可能生成的数字是一样的,但可以认为这种概率非常小)。

标签:Console,Person,C#,Equals,对象,WriteLine,zsCopy,比较,zs
From: https://www.cnblogs.com/SmallCarp/p/17703454.html

相关文章

  • 萌新学习c语言记录
    好久没发博客了,因为大学开学了我看到我们学校社团的题目求两个数的最大公约数和最小公倍数感觉不怎么难在上课的时候闲的无聊写下来了。......
  • 40 个超有意思的 CSS 网站
    ......
  • v$active_session_history无数据
    我们知道V$ACTIVE_SESSION_HISTORY显示数据库中的采样会话活动。它包含每秒拍摄一次的活动数据库会话的快照。环境是ORACLE19.11,AWR,ASH均无数据。查看v$active_session_history性能视图也无数据。SQL>selectcount(*)fromv$active_session_history;COUNT(*)---------......
  • 【230914-5】▲ABC中,C=2倍根号2,a>b,tanA+tanB=5,tanAtanB=6. 求:S△ABC=?
    ......
  • C++ STL
    Dev-C++可在工具->编译选项->代码生成/优化->代码生成->语言标准中选择“ISOC++11”或“GNUC++11”来支持C++11的新特性(蓝Dev还不支持C++14)不声明下,区间均为左闭右开区间,typename表示一个数据类型而不是C++的关键字。Containter(容器)vectorvector<t......
  • OpenCASCADE GLFW IMGUI
    OpenCASCADEGLFWIMGUI如果从事过C++Windows客户端开发,大家对MFC、Qt、DuiLib、WxWidgets等各种DirectUI应该有了解,本篇给大家介绍一个超级轻量级的C++开源跨平台图形界面框架ImGUI.ImGUI主要用于游戏行业,所有的控件都需要手绘实现,当然性能也是满满的,毕竟是直接用dx/opengl来......
  • 【考后总结】9 月 CSP-S 模拟赛 4
    9.14CSP模拟38T1我是A题每个点坐标都至少有一维卡上界。那么按照哪一维卡上界分成\((A,v,w),(u,B,w),(u,v,C)\)三类,对于点\((x,y,z)\),如果会被第一类点删去,那么第一维就不需要考虑了,只需要满足\(y\)不大于所有\(w\)大于等于\(z\)的第一类点中\(v\)的最大值。......
  • CSP 2023 游记
    有人已经开始催我写游记了???DAY-1凌乱……作业写完了,然后就开始再度刷复赛卷……明天的课只能咕了,相比OI,数学算什么!(doge,我今天数学考试还炸了阅读程序噩梦啊啊啊,完善程序要命啊啊啊,一整个疯狂的状态无可奈何啊,初赛前垂死挣扎一下吧QAQ晚上重刷CSP-J2019的卷子吧,不知结果会......
  • KVM02-tigerVNC安装使用
    4.安装配置tigerVNC[复制出来的文件必须是数字这个决定了之后vnc的监听端口]sudoyuminstalltigervnc*-ysudocp/usr/lib/systemd/system/[email protected]/usr/lib/systemd/system/vncserver@:2.servicesudovi/usr/lib/systemd/system/vncserver@:2.service修改......
  • IDEA 22.2.3 创建web项目及Tomcat部署与服务器初始界面修改(保姆版)
    开始前请确认自己的Tomcat、JDK已经安装配置完毕不同版本的IDEA创建配置流程可能不同,演示中的IDEA版本号为22.2.3本教程创作时间为2023/09/141.创建项目通过下图路径进入创建界面,项目名称、路径、JDK都选择完毕后点击Create创建2.创建web目录右键单击目录名呼出二级菜单......