当前位置: 首页 > 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;从而提高访问速度。 进行负载均衡…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践&#xff0c;很多人以为AI已经强大到不需要程序员了&#xff0c;其实不是&#xff0c;AI更加需要程序员&#xff0c;普通人…...