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

C# 重载运算符

目录

简介

 语法

使用规则

示例

使用场景


简介

什么是重载运算符

利用现有的某种运算符,针对自定义类或者结构,来定义某种运算操作。

为什么需要重载运算符

利用现有的运算符,简化自定义类型的操作。最好是,该运算符和该操作符,具有一定的相关性。

可以重载的运算符不可以重载的运算符
+ 加法= 赋值运算符
- 减法(一元和二元)?: 条件运算符(三元运算符)
* 乘法:: 作用域解析运算符
/ 除法new 对象实例化运算符
% 取模is 类型检查运算符
& 位与as 类型转换运算符
^ 位异或sizeof 大小运算符
|| 逻辑或checked unchecked 检查上下文运算符
&& 逻辑与delegate 委托运算符
== 等于    != 不等于stackalloc 栈分配运算符
<< 左移位
>> 右移位

 语法

public static 返回值 operator重载运算符(){}

使用规则

  1. 运算符重载的声明运算符重载必须在自定义类型(类或结构体)中声明,并且必须是 publicpublic static 的方法。每个运算符重载方法必须使用 operator 关键字声明。

  2. 运算符重载的方法签名 每个运算符重载方法必须使用特定的签名。例如,+ 运算符的重载方法必须接受两个参数并返回一个值。

  3. 对称性 如果你重载了 + 运算符,那么你也应该重载 -* 和其他相关的运算符,以保持操作的一致性。

  4. 运算符的限制不是所有运算符都可以重载。例如,.(成员访问运算符)和 ::(范围解析运算符)无法重载。

示例

using System;public class Point
{public int X { get; set; }public int Y { get; set; }public Point(int x, int y){X = x;Y = y;}// 重载 + 运算符public static Point operator +(Point p1, Point p2){return new Point(p1.X + p2.X, p1.Y + p2.Y);}// 重载 - 运算符public static Point operator -(Point p1, Point p2){return new Point(p1.X - p2.X, p1.Y - p2.Y);}// 重写 ToString 方法以便于输出 Point 对象public override string ToString(){return $"({X}, {Y})";}
}public class Program
{public static void Main(){Point p1 = new Point(3, 4);Point p2 = new Point(1, 2);// 使用重载的 + 运算符Point sum = p1 + p2;Console.WriteLine($"Sum: {sum}"); // 输出: Sum: (4, 6)// 使用重载的 - 运算符Point difference = p1 - p2;Console.WriteLine($"Difference: {difference}"); // 输出: Difference: (2, 2)Console.ReadKey();}
}

使用场景

  • 数学运算:自定义数学类,如复数、矩阵等,可以通过运算符重载实现直观的数学运算。
  • 比较操作:自定义比较类型(如自定义的时间、货币类型)可以通过运算符重载实现直观的比较操作。
  • 集合操作:自定义集合类(如自定义的集合类型)可以通过运算符重载实现集合操作,如并集、交集等

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • web自动化测试Day5
  • 举例说明自然语言处理(NLP)技术。
  • Web前端:CSS篇(二)背景,文本,链接
  • 【ML】Image Augmentation)的作用、使用方法及其分类
  • UIScrollView 的 pagingEnabled属性(UIScrollView默认一次滑动多少距离?)
  • 掌握SQL的威力:批量更新与删除的艺术
  • 如何在 Windows/Mac/在线/iPhone/Android 上将 PDF 转换为 Word
  • leetcode算法题之N皇后
  • 软件测试要学习的基础知识——黑盒测试
  • 静态路由与默认路由和实验以及ARP工作原理
  • 动画展示梯度下降(二维)
  • XSS的DOM破坏
  • Linux·权限与工具-yum与vim
  • 说一下Android中的IdleHandler
  • 每日一问:Kafka消息丢失与堆积问题分析与解决方案
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CentOS7简单部署NFS
  • Lsb图片隐写
  • springMvc学习笔记(2)
  • 服务器之间,相同帐号,实现免密钥登录
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一些关于Rust在2019年的思考
  • - 转 Ext2.0 form使用实例
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #if和#ifdef区别
  • #Linux(Source Insight安装及工程建立)
  • #QT(串口助手-界面)
  • (04)odoo视图操作
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2)STL算法之元素计数
  • (39)STM32——FLASH闪存
  • (BFS)hdoj2377-Bus Pass
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (pycharm)安装python库函数Matplotlib步骤
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (七)glDrawArry绘制
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十) 初识 Docker file
  • (四)React组件、useState、组件样式
  • (四)库存超卖案例实战——优化redis分布式锁
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (循环依赖问题)学习spring的第九天
  • (一)、python程序--模拟电脑鼠走迷宫
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET和.COM和.CN域名区别
  • .NET开发人员必知的八个网站
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET性能优化(文摘)