Microsoft.NET 框架程序设计 —— 通用对象操作

对象的等值性与惟一性

        如前所述,System.Obiect类型提供了一个名为Equals 的虚方法,其目的为判断两个对象是否有着相同的“值”。微软的.NET框架类库(FCL)中包括的许多方法(例如 System.Array的IndexOf方法System.Collections.ArrayList的 Contains 方法)在内部都调用到了 Equals方法。因为 Equals 方法定义在Obiect中,而每个类型最终都派生自Obiect,所以我们可以保证每个类型的实例都有一个这样的 Equals方法。对于那些没有显式重写Equals方法的类型,Obiect(或者重写了Eauals方法的最近的那个基类) 提供的实现将被继承。下面的代码展示了System.Obiect 类型中的Equals 方法实现:

class object {public virtual Boolean Equals(0bject obj){//如果两个引用指向的是同一个对象//它们肯定相等if (this == obj)return(true);//假定两个对象不相等return(false);}...
}

        如我们所见,该方法采取的策略可能是最简单的:如果进行比较的两个引用指向的是同一个对象方法将返回true;否则在任何其他情况下,方法都将返回false。如果我们定义了自己的类型,并且希望比较它们中的字段是否相等,Object类型提供的默认实现对我们来说是不够的,我们必须重写Equals方法,提供自己的实现。

        当实现自己的Equals方法时,我们必须确保它遵循以下4条规则:

  • Equals 方法必须是自反的,也就是说,x.Equals(x)必须返回true。
  • Equals 方法必须是对称的,也就是说,x.Equals(y)和y.Equals(x)必须返回同样的值。.
  • Equals 方法必须是可传递的,也就是说,如果x.Equals(y)和y.Equals(z)都返回 true,那么x.Equals(z)也必须返回 true。
  • Equals方法必须是前后一致的,也就是说,如果两个对象的值没有发生改变,多次调用Equals力法的返回值应该相同。

        如果我们为Eguals方法提供的实现没有遵循上述4条规则,我们的应用程序将会发生一些奇怪的不可预期的行为。

        不幸的是,重写 Obiect 的 Equals方法并不如想象的那么容易。我们必须执行许多步操作,并且要保证每一步操作都是正确的。另外,根据我们定义的类型的不同,这些操作也会有一些差别。所幸的是,实现Eguals方法只有3种不同的方式。下面我们逐一讨论每一种模式。

为基类没有重写 Obiect.Eauals 方法的引用类型实现 Eauals

        对于那些直接继承了Obiect的 Equals实现的类型,下面的代码展示了怎样为它们实现 Equals方法:

    //这是一个引用类型('class'的缘故)class MyRefType : Baserype{RefType refobj;    //该字段是一个引用类型Valrype valobj;    //该字段是一个值类型pubiic override Boolean quals(0bject obj){//因为'this'不为null,所以如果obj 为 null,//那么两个对象将不可能相等if (obj == null) return false;//如果两个对象的类型不同,那么它们不可能相等if(this.GetType()!= obj.GetType())return false;//将ob〕转型为定义的类型以访问其中的字段。注意这里的转型不会失败,因为已经知道两个对象是同一个类型1/MyRefType other = (MyRefrype)obj;//比较其中的引用类型字段if (!0bject.Equals(refobj, other.refobj))return false;//比较其中的值类型字段if (!valobj,Equals(other.valobj))return false;return true;//到这里两个对象才算相等}//重载==和!=操作符(可选)public static Boolean operator ==(MyRefrype ol, MyRefrype o2){return object.Equals(ol,o2);}public static Boolean operator !=(MyRefrype ol, MyRefType o2){return !(o1 == 02);}}

        这里实现的 Eguals首先将 obi和 nu相比较。如果被比较的对象不为 null,那么接着比较两个对象的类型。如果两个对象的类型不同,那么它们不可能相等。如果两个对象有着相同的类型,就将obi 转型为 MyRefType,这里的转型不可能抛出异常,因为我们已经知道两个对象为同一个类型。等上述所有步骤都正确执行完毕后,我们才开始比较两个对象中的字段。如果两个对象中所有的字段都相等,方法将返回 true。

        在比较两个对象中的字段时,我们必须非常仔细。前面的代码展示了根据字段类型的不同,所进行的两种不同的比较方式。

比较引用类型的字段

要比较引用类型的字段,我们应该调用Obiect的静态Equals 方法。Object 的静态 Equals方法是一个比较两个引用类型对象的辅助方法。下面展示了 Object 的静态Eguals方法的内部实现:

    public static Boolean Equals(0bject objA, object objB){// 如果 objA 和 objB 指向的是同--个对象,方法返回 trueif (objA == objB)return true;// 如果 objA 或者 objB 为nu1l,它们不可能相等,方法返回 falseif ((objA == null)|l(objB == null))return f

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++贪心算法(2)

最大子矩阵 #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int a[110][110]{0};int b[110][110]{0};for(int i1;i<n;i){for(int j1;j<n;j){cin>>a[i][j];if(i1&&j1){b[i][j]b[i][j-1]a[i][j];}else{b[i][j]b[i][j-1]…

接口使用实例——数组排序

对于基本数据类型的大小比较&#xff0c;我们可以使用<,>,或者equals方法进行比较&#xff0c;但是对象之间如何进行比较呢&#xff1f;要对对象进行比较&#xff0c;我们必须对同一个成员变量进行比较&#xff0c;如我们可以通过比较name的大小来得出两个对象的大小&…

python-数据可视化

python-数据可视化 ** 数据可视化指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘**紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据 最流行的工具之一…

【一步一步了解Java系列】:何为数组,何为引用类型

看到这句话的时候证明&#xff1a;此刻你我都在努力加油陌生人个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 数组 数组是一推相同数据…

数据迁移利器登场!Elasticdumpv6.110震撼发布,助你轻松搬迁大数据!

简介 Elasticdump 是一个用于导出和导入 Elasticsearch 数据的工具。它能够从一个 Elasticsearch 集群读取数据并写入到另一个 Elasticsearch 集群、文件系统或其他数据存储&#xff08;例如 S3&#xff09;。这个工具非常有用&#xff0c;特别是在进行数据迁移、备份和恢复操作…

2024年学浪视频怎么下载到手机相册

随着2024年的到来&#xff0c;学浪平台继续为广大学习者提供优质的在线教育资源。然而&#xff0c;如何将这些宝贵的视频内容下载到手机相册&#xff0c;方便随时离线观看呢&#xff1f;无论您是想在旅途中学习&#xff0c;还是希望在没有网络的情况下复习课程&#xff0c;本文…

1106 2019数列

solution 维护长度为4的数组&#xff0c;对于第四位之后的数字&#xff0c;为所维护数组的所有元素之和 的个位数 #include<iostream> using namespace std; int main(){int n, a[4] {2, 0, 1, 9}, cnt 0, d;scanf("%d", &n);for(int i 0; i < n; …

kettle从入门到精通 第六十三课 ETL之kettle kettle调用python脚本的两种方法

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群&#xff0c;一起学习&#xff0c;共同进步。若二维码失效&#xff0c;公众号后台加我微信入群&#xff0c;备注kettle。 kettle中不能直接调用python脚本&#xff0c;可以通过shell脚本和http进行调用pyton服务。 一、shel…

深入理解Java的垃圾回收机制(GC)实现原理

深入理解Java的垃圾回收机制&#xff08;GC&#xff09;实现原理 Java的垃圾回收机制&#xff08;Garbage Collection, GC&#xff09;是其内存管理的核心功能之一。通过GC&#xff0c;Java自动管理对象的生命周期&#xff0c;回收不再使用的对象所占的内存空间。本文将详细探…

Golang | Leetcode Golang题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; func isInterleave(s1 string, s2 string, s3 string) bool {n, m, t : len(s1), len(s2), len(s3)if (n m) ! t {return false}f : make([]bool, m 1)f[0] truefor i : 0; i < n; i {for j : 0; j < m; j {p : i j - 1if i >…

C++的数据结构(十八):并查集

并查集&#xff08;Union-Find&#xff09;是一种用于处理一些不交集&#xff08;Disjoint Sets&#xff09;问题的数据结构。它主要支持两种操作&#xff1a;合并集合&#xff08;Union&#xff09;和查找元素所属集合&#xff08;Find&#xff09;。在解决诸如连通性问题、网…

牛客小白月赛94( 6 / 6 )

小苯的九宫格 #include<bits/stdc.h> using namespace std; map<int,int>mp; void solve(){for(int i1;i<9;i){int x;cin>>x;mp[i]x;}string s;cin>>s;for(auto i:s){cout<<mp[i-0];} } int main(){ios::sync_with_stdio(false), cin.tie(0)…

Ruoyi框架学习——权限管理

权限分类 菜单权限&#xff1a;用户登录系统之后能看到哪些菜单按钮权限&#xff1a;用户在一个页面上能看到哪些按钮&#xff0c;比如新增、删除等按钮接口权限&#xff1a;用户带着认证信息请求后端接口&#xff0c;是否有权限访问&#xff0c;该接口和前端页面上的按钮一一对…

AI生成内容检测|Fast-DetectGPT:通过条件概率曲率对机器生成文本进行有效的零样本检测

【摘要】大型语言模型 (LLM) 已显示出生成流畅且有说服力的内容的能力&#xff0c;这既带来了生产力机会&#xff0c;也带来了社会风险。要构建值得信赖的 AI 系统&#xff0c;必须区分机器生成的内容和人类创作的内容。领先的零样本检测器 DetectGPT 展示了值得称赞的性能&…

Github 2024-05-25 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Svelte项目1TypeScript项目1Python项目1Go项目1Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust…

建筑工程乙级资质全面解析:设计能力与业务范畴

建筑工程乙级资质全面解析&#xff1a;设计能力与业务范畴 建筑工程乙级资质是中国建筑业中一项重要的资质认证&#xff0c;标志着设计单位具备一定规模和水平的专业技术力量&#xff0c;能够在限定范围内承担建筑设计及相关工程服务。本文将深入解析乙级资质的设计能力与业务…

如果有多个文件夹,怎么快速获得文件夹的名字呢

上一篇写到怎么批量建立文件夹&#xff0c;那么怎么获取批量文件夹的名字呢&#xff1f; 一、啊这&#xff0c;这真是一个好问题二、这个得用Python&#xff08;文本末尾有打包程序&#xff0c;点击链接运行就可以了&#xff09;&#xff08;1&#xff09;首先建立一个py文件&a…

博客系统(Servlet实现)

目录 1.准备工作 2.数据库设计 2.1表设计 2.2封装数据库操作代码 2.3创建 Blog 类 和 User 类 2.4创建 BlogDao 类和 UserDao 类 3.读取博客列表功能 3.1约定前后端交互接口 3.2实现服务器代码 3.3实现客户端代码 4.实现博客详情 4.1约定前后端交互接口 4.2实现服…

AGI技术与原理浅析:曙光还是迷失?

前言&#xff1a;回顾以往博客文章&#xff0c;最近一次更新在2020-07&#xff0c;内容以机器学习、深度学习、CV、Slam为主&#xff0c;顺带夹杂个人感悟。笔者并非算法科班出身&#xff0c;本科学制药、研究生学金融&#xff0c;最原始的算法积累都来源于网络&#xff0c;当时…

Android android.os.DeadObjectException aidl通信异常分析及解决

问题描述 做一款音乐播放应用&#xff0c;播放服务是通过AIDL形式对外暴露&#xff0c;允许跨进程调用且多个App同时操作音乐播放&#xff0c;偶现android.os.DeadObjectException问题 12-15 09:28:12.371: W/System.err(5412): android.os.DeadObjectException 12-15 09:28:…