当前位置: 首页 > news >正文

C#运算符重载

运算符重载允许你重新定义内置运算符(如+、-、*等)的行为,以便它们可以用于自定义类型(类/结构体)。通过运算符重载,你可以为自定义类型创建更直观和灵活的操作。

在C#中,可以重载的运算符如下:

1. 一元运算符:`+`、`-`、`!`、`~`、`++`、`--`
2. 二元算术运算符:`+`、`-`、`*`、`/`、`%`
3. 二元关系运算符:`==`、`!=`、`<`、`>`、`<=`、`>=`
4. 逻辑运算符:`&&`、`||`
5. 位运算符:`&`、`|`、`^`、`<<`、`>>`
6. 赋值运算符:`=`
7. 类型转换运算符:`as`、`is`、`(type)`
8. 索引运算符:`[]`

需要注意的是,运算符重载有一些限制和规则:

1. 不允许重载的运算符:`.`(成员访问)、`?:`(条件表达式)、`sizeof`(类型大小)和`typeof`(获取类型信息)。
2.注意:在C#中,二元关系运算符(如`==`、`!=`、`<`、`>`、`<=`、`>=`)需要成对实现。如果你重载了其中一个二元关系运算符,那么通常应该同时重载其对应的运算符,以确保一致性和可预测性。

这是因为这些二元关系运算符之间存在一定的关联性和逻辑关系。例如,如果你重载了`==`运算符用于对象的相等比较,那么通常也需要重载`!=`运算符来进行不等比较。

以下是一些常见的二元关系运算符及其对应的运算符:

- `==`(相等)对应 `!=`(不等)
- `!=`(不等)对应 `==`(相等)
- `<`(小于)对应 `>`(大于)
- `>`(大于)对应 `<`(小于)
- `<=`(小于等于)对应 `>=`(大于等于)
- `>=`(大于等于)对应 `<=`(小于等于)

 

3. 重载运算符必须声明为公共和静态的。
4. 运算符重载方法必须具有特定的签名,并且必须与运算符的预定义行为相匹配

总结起来,可以重载大多数常见的运算符,但有一些特殊运算符是不允许重载的。在设计和使用运算符重载时,应当遵循一定的规则和约定,以确保代码的可读性和可维护性。

以下是代码实战:

1.重载运算符+:

namespace 运算符重载
{class Point{public int x;public int y;public static Point operator+(Point p1,Point p2){Point p = new Point();p.x= p1.x + p2.x;p.y = p1.y + p2.y;return p;}}   internal class Program{static void Main(string[] args){Point p = new Point();p.x = 1;p.y = 2;Point p2 = new Point();p2.x = 2;p2.y = 3;Point p3 = p + p2;}}}

这段代码演示了在C#中如何对加法运算符进行重载。具体解释如下:

  1. 定义了一个名为Point的类,该类包含两个公共的整型属性 xy,表示二维平面上的一个点。

  2. 重载了加法运算符 + 的方法:

    此重载方法接受两个 Point 对象作为参数,并返回一个新的 Point 对象在方法内部,根据两个点的坐标分别相加,创建一个新的 Point 对象并返回。
  3. Main 方法中,创建了两个 Point 对象 pp2,并分别给它们的 xy 属性赋值。

  4. 使用重载的加法运算符 +pp2 相加,将结果赋值给 p3

总结来说,运算符重载允许我们重新定义现有运算符的行为,使其适用于自定义的数据类型。在这个例子中,通过重载加法运算符,我们定义了两个 Point 对象相加的行为,使其返回一个新的 Point 对象。

2.重载运算符+:

namespace 运算符重载
{class Point{public int x;public int y;public static Point operator +(Point p1, int value){Point p = new Point();p.x = p1.x + value;p.y = p1.y + value;return p;}}   internal class Program{static void Main(string[] args){Point p = new Point();p.x = 1;p.y = 2;Point p2 = new Point();p2.x = 2;p2.y = 3;Point p4= p + 2;}
}}

这段代码演示了在C#

中如何对加法运算符进行重载,具体解释如下:

1. 定义了一个名为`Point`的类,该类表示二维平面上的一个点,并包含两个公共的整型属性 `x` 和 `y`,分别表示点的横坐标和纵坐标。

2. 重载了加法运算符 `+` 的方法:
   - 这个重载方法接受两个参数:一个是 `Point` 类型的对象 `p1`,另一个是 `int` 类型的值 `value`。
   - 在这个重载方法内部,创建了一个新的 `Point` 对象 `p`,并将其横坐标和纵坐标分别设置为原始点对象 `p1` 的横坐标和纵坐标与给定的整数值 `value` 相加的结果。
   - 最后返回这个新创建的 `Point` 对象 `p`。

3. 在 `Main` 方法中,首先创建了两个 `Point` 对象 `p` 和 `p2`,并分别给它们的 `x` 和 `y` 属性赋值。

4. 使用重载的加法运算符 `+` 将 `p` 和整数值 `2` 相加,将结果赋值给 `p4`。这里实际上是调用了之前重载的方法,将 `p` 对象和整数值 `2` 作为参数传递给了重载的加法运算符方法。

5.在重载运算符的上下文中,`Point p1` 不需要通过 `new` 关键字创建一个新的对象,它是作为运算符重载方法的参数传递进来的,代表了调用重载运算符的左操作数。

当你写下 `p.x = p1.x + value;` 时,实际上是在使用调用该运算符的左操作数 `p1` 的属性 `x` 的值,然后加上给定的整数值 `value`。由于 `p1` 是一个已经存在的 `Point` 对象,因此可以直接访问其属性值,并进行相应的操作。

通过运算符重载方法,我们可以在不创建新的对象的情况下,对现有的对象进行操作并返回结果,而不需要显式使用 new 关键字创建新的对象。

总之,在运算符重载的上下文中,左操作数和右操作数都可以直接访问其属性值,不需要额外创建新的对象。

最终,通过重载的加法运算符 `+`,我们可以将一个点对象和一个整数值相加,得到一个新的点对象,其横坐标和纵坐标分别为原始点对象的横坐标和纵坐标与给定的整数值相加的结果。

3.重载运算符==

注意:在C#中,二元关系运算符(如`==`、`!=`、`<`、`>`、`<=`、`>=`)需要成对实现。

 namespace 运算符重载
{struct Position{public int x;public int y;public static bool operator ==(Position p1, Position p2){if(p1.x == p2.x && p1.y == p2.y){return true;}return false;}public static bool operator !=(Position p1, Position p2){if (p1.x == p2.x && p1.y == p2.y){return false;}return true;}}internal class Program{static void Main(string[] args){Position p11;p11.x = 1;p11.y = 1;Position p22;p22.x = 1;p22.y = 1;if (p11 == p22){Console.WriteLine("相等");}}} }

这段代码演示了如何在C#中重载相等运算符(`==`)和不相等运算符(`!=`)。

1. 首先定义了一个名为 `Position` 的结构体。结构体类似于类,用于表示一个位置(二维平面上的点),并包含两个公共的整型属性 `x` 和 `y`。

2. 接下来,通过使用 `operator ==` 关键字,重载了相等运算符 `==` 的方法。该方法接受两个 `Position` 类型的对象 `p1` 和 `p2` 作为参数,并返回一个布尔值。

3. 然后,通过使用 `operator !=` 关键字,重载了不相等运算符 `!=` 的方法。与相等运算符的重载方法类似,不相等运算符的重载方法也接受两个 `Position` 对象 `p1` 和 `p2` 作为参数,并返回一个布尔值。

在方法内部,如果 `p1` 的 `x` 属性和 `p2` 的 `x` 属性相等,并且 `p1` 的 `y` 属性和 `p2` 的 `y` 属性相等,则返回 `false`,否则返回 `true`。

4. 在 `Main` 方法中,首先声明了两个 `Position` 对象 `p11` 和 `p22`,并分别给它们的 `x` 和 `y` 属性赋值。

5. 然后,通过使用重载的相等运算符 `==`,将 `p11` 和 `p22` 进行比较。如果它们的 `x` 属性和 `y` 属性都相等,则输出 "相等"。

有什么问题欢迎大家留言呀~

相关文章:

C#运算符重载

运算符重载允许你重新定义内置运算符&#xff08;如、-、*等&#xff09;的行为&#xff0c;以便它们可以用于自定义类型&#xff08;类/结构体&#xff09;。通过运算符重载&#xff0c;你可以为自定义类型创建更直观和灵活的操作。 在C#中&#xff0c;可以重载的运算符如下&…...

【L2GD】: 无环局部梯度下降

文章链接&#xff1a;Federated Learning of a Mixture of Global and Local Models 发表期刊&#xff08;会议&#xff09;: ICLR 2021 Conference&#xff08;机器学习顶会&#xff09; 往期博客&#xff1a;FLMix: 联邦学习新范式——局部和全局的结合 目录 1.背景介绍2. …...

2023-11-14 LeetCode每日一题(阈值距离内邻居最少的城市)

2023-11-14每日一题 一、题目编号 1334. 阈值距离内邻居最少的城市二、题目链接 点击跳转到题目位置 三、题目描述 有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的…...

AdServices归因和iAd归因集成

AdServices framework 是 Apple 专门为 ASA 提供的归因框架 。尤其在ATT 政策推出以后&#xff0c;app 获取用户 IDFA 的比例大幅降低&#xff0c;传统的依靠IDFA 的方法也无法准确归因。 但是 Apple 为 ASA 开了一个后门&#xff0c;其他广告渠道无法获取用户的 IDFA 作为身份…...

关于 内部类 你了解多少?(详解!!)

目录 1. 什么是内部类&#xff1f; 2. 内部类的分类 3. 内部类 3.1 实例内部类 3.2 静态内部类 4. 局部内部类 5. 匿名内部类 6.对象的打印 “不积跬步无以至千里&#xff0c;不积小流无以成江海。”每天坚持学习&#xff0c;哪怕是一点点&#xff01;&#xff01;&a…...

CNVD-2021-09650:锐捷NBR路由器(guestIsUp.php)RCE漏洞复现 [附POC]

文章目录 锐捷NBR路由器guestIsUp.php远程命令执行漏洞(CNVD-2021-09650)复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 锐捷NBR路由器guestIsUp.php远程命令执行漏洞(CNVD-2021-09650)复现 [附POC] 0x01 前言 免…...

如何在Docker部署Draw.io绘图工具并远程访问

文章目录 前言1. 使用Docker本地部署Drawio2. 安装cpolar内网穿透工具3. 配置Draw.io公网访问地址4. 公网远程访问Draw.io 前言 提到流程图&#xff0c;大家第一时间可能会想到Visio&#xff0c;不可否认&#xff0c;VIsio确实是功能强大&#xff0c;但是软件为收费&#xff0…...

Android APK打包的过程主要步骤

Android APK打包的过程可以概括为以下几个主要步骤&#xff1a; 编译源代码&#xff1a;将开发好的Java源代码编译成Dalvik字节码文件&#xff08;.dex文件&#xff09;&#xff0c;Android安卓该文件包含了Android平台上的运行程序的指令集。打包资源文件&#xff1a;将应用程…...

吃透 Spring 系列—MVC部分

目录 ◆ SpringMVC简介 - SpringMVC概述 - SpringMVC快速入门 - Controller中访问容器中的Bean - SpringMVC关键组件浅析 ◆ SpringMVC的请求处理 - 请求映射路径的配置 - 请求数据的接收 - Javaweb常用对象获取 - 请求静态资源 - 注解驱动 标签 ◆ SpringMV…...

Java面试题(每天10题)-------连载(32)

目录 设计模式篇 1、工厂方法模式&#xff08;利用创建同一接口的不同实例&#xff09;&#xff1a; 2、抽象工厂模式&#xff08;多个工厂&#xff09; 3、单例模式&#xff08;保证对象只有一个实例&#xff09; 4、原型模式&#xff08;对一个原型进行复制、克隆产生类…...

HDP集群Kafka开启SASLPLAINTEXT安全认证

hdp页面修改kafka配置 java代码连接kafka增加对应的认证信息 props.put("security.protocol","SASL_PLAINTEXT");props.put("sasl.mechanism","PLAIN");props.put("sasl.jaas.config","org.apache.kafka.common.securi…...

判断上颌下颌的stl模型坐标轴是否正常

文章目录 研究方向:如何判断?又如何纠正?如何判断?Demo实现:先判断一个遍历相关文件夹下的所有病例如何纠正?Demo相关知识点研究方向:如何判断?又如何纠正? 如何判断? 当然,我们不能以坐标的正负来判断 我们看到这个Bounding Box里面有stl模型的xyz三轴方向的最大值与最…...

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…...

Arthas(阿尔萨斯)--(三)

目录 一、Arthas学习 1、class/classloader相关命令一 1、sc 2、sm 2、class/classloader相关命令二 1、jad 2、mc 3、redefine 三、class/classloader相关命令三 一、Arthas学习 Arthas(阿尔萨斯)--(一) Arthas(阿尔萨斯)--(二) 1、class/classloader相关命令一 …...

《变形监测与数据处理》笔记/期末复习资料(择期补充更新)

变形&#xff1a; 变形是物体在外来因素作用下产生的形状、大小及位置的变化&#xff08;随时间域和空间域的变化&#xff09;&#xff0c;它是自然界普遍存在的现象。 变形体&#xff1a; 一般包括工程建筑物、构筑物、大型机械设备以及其他自然和人工对象等。 变形体和变形…...

Linux:进程替换和知识整合

文章目录 进程程序替换替换原理进程替换的理解 环境变量与进程替换命令行解释器实现逻辑 进程程序替换 前面已经学习了子进程的创建&#xff0c;但是子进程的创建不管怎么说&#xff0c;都是父进程代码的一部分&#xff0c;那么实际上如果想要子进程执行新的程序呢&#xff1f…...

React组件在什么情况下会重新渲染

当我们使用React编写组件时&#xff0c;组件的重新渲染是一个重要的概念。重新渲染是指React组件在特定情况下会重新执行其渲染函数&#xff0c;更新用户界面以反映最新的数据。很多情况下&#xff0c;组件不必要的重新渲染会严重影响性能&#xff0c;所以要充分了解触发组件重…...

云ES容灾方案

一、ES集群可用性容灾 1.1 云ES集群可用性容灾(使用跨可用区实例) 云ES集群部署在三个可用区,单可用区故障,云ES集群依然可能对外提供服务;两个可用区故障,需要进行控制台切流(集群会自动切的选择主节点) 应用服务部署在二个可用区,单可用区故障,依然可对提供服务1.2 …...

Golang 中的 Context 包

简介 今天&#xff0c;我们将讨论 Go 编程中非常重要的一个主题&#xff1a;context 包。如果你现在觉得它很令人困惑&#xff0c;不用担心 — 在本文结束时&#xff0c;你将像专家一样处理 context&#xff01; 想象一下&#xff0c;你在一个主题公园&#xff0c;兴奋地准备…...

nginx服务器

nginx反向代理 nginx 反向代理的好处&#xff1a; 提高访问速度 因为nginx本身可以进行缓存&#xff0c;如果访问的同一接口&#xff0c;并且做了数据缓存&#xff0c; nginx就直接可把数据返回&#xff0c;不需要真正地访问服务端&#xff0c;从而提高访问速度。 进行负载均衡…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...