c# 自定义隐式转换与运算符重载
用户定义的显式和隐式转换运算符
参考代码
用户定义的显式和隐式转换运算符 - 提供对不同类型的转换 | Microsoft Learn
代码例程
using System;public readonly struct Digit
{private readonly byte digit;public Digit(byte digit){if (digit > 9){throw new ArgumentOutOfRangeException(nameof(digit), "Digit cannot be greater than nine.");}this.digit = digit;}public static implicit operator byte(Digit d) => d.digit;public static explicit operator Digit(byte b) => new Digit(b);public override string ToString() => $"{digit}";
}public static class UserDefinedConversions
{public static void Main(){var d = new Digit(7);byte number = d;Console.WriteLine(number); // output: 7Digit digit = (Digit)number;Console.WriteLine(digit); // output: 7}
}
自实现 隐式运算符转换例程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp5
{class Person{public string Name { get; set; }public int age { get; set; }public Person(string name, int age){Name = name;this.age = age;}/// <summary>/// 自定义隐式转换/// </summary>/// <param name="p"></param>public static implicit operator string (Person p){return p.Name;}}internal class Program{static void Main(string[] args){Person p1 = new Person("张三",20);Person p2 = new Person("李四", 30);string username = p1 + p2; //自定义对象隐式转换Console.WriteLine(username);Console.ReadLine();}}
}
运行结果
上面当然也可以适用于年龄,只需要修改返回值即可。
自实现 显式运算符转换例程
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp7
{class Person{public string Name { get; set; }public int age { get; set; }public Person(string name, int age){Name = name;this.age = age;}/// <summary>/// 自定义隐式转换/// </summary>/// <param name="p"></param>//public static implicit operator string(Person p)//{// return p.Name;//}//public static implicit operator Person(string name)//{// return new Person(name, 0);//}///运算符重载public static string operator +(Person p1, Person p2){return p1.Name + p2.Name; }}internal class Program{static void Main(string[] args){Person p1 = new Person("张三", 20);Person p2 = new Person("李四", 30);//string username = p1 + p2; //自定义对象隐式转换//Console.WriteLine(username);//Person p3 = "王五"; //强转,与视频中不同的时前面没有加括号//Person p3a = (Person)"赵六"; //视频中加了括号强转//Console.WriteLine(p3.Name + " " + p3.age.ToString());//Console.WriteLine(p3a.Name + " " + p3a.age.ToString());string username = p1 + p2; //自定义对象 + 重载Console.WriteLine(username);Console.ReadLine();}}
}
运行结果
与上面的相同,注意这里时显式运算符重载。
强制类型转换
自定义对象强转转换
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp6
{class Person{public string Name { get; set; }public int age { get; set; }public Person(string name, int age){Name = name;this.age = age;}/// <summary>/// 自定义隐式转换/// </summary>/// <param name="p"></param>//public static implicit operator string(Person p)//{// return p.Name;//}public static implicit operator Person(string name){return new Person(name, 0);}}internal class Program{static void Main(string[] args){Person p1 = new Person("张三", 20);Person p2 = new Person("李四", 30);//string username = p1 + p2; //自定义对象隐式转换//Console.WriteLine(username);Person p3 = "王五"; //强转,与视频中不同的时前面没有加括号Person p3a = (Person)"赵六"; //视频中加了括号强转Console.WriteLine(p3.Name + " " + p3.age.ToString());Console.WriteLine(p3a.Name + " " + p3a.age.ToString());Console.ReadLine();}}
}
运行结果(注意没有初始化年龄,使用默认)
+运算符重载
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApp8
{class Person{public string Name { get; set; }public int age { get; set; }public Person(string name, int age){Name = name;this.age = age;}/// <summary>/// 自定义隐式转换/// </summary>/// <param name="p"></param>//public static implicit operator string(Person p)//{// return p.Name;//}//public static implicit operator Person(string name)//{// return new Person(name, 0);//}///运算符重载public static string operator +(Person p1, Person p2){return p1.Name + p2.Name;}public static Person operator ++(Person p){p.age++;return p;}}internal class Program{static void Main(string[] args){Person p1 = new Person("张三", 20);Person p2 = new Person("李四", 30);//string username = p1 + p2; //自定义对象隐式转换//Console.WriteLine(username);//Person p3 = "王五"; //强转,与视频中不同的时前面没有加括号//Person p3a = (Person)"赵六"; //视频中加了括号强转//Console.WriteLine(p3.Name + " " + p3.age.ToString());//Console.WriteLine(p3a.Name + " " + p3a.age.ToString());//string username = p1 + p2; //自定义对象 + 重载//Console.WriteLine(username);p1++;Console.WriteLine(p1.age.ToString());Console.ReadLine();}}
}
运行结果(略)
附一个微软的例子
public readonly struct Fraction
{private readonly int num;private readonly int den;public Fraction(int numerator, int denominator){if (denominator == 0){throw new ArgumentException("Denominator cannot be zero.", nameof(denominator));}num = numerator;den = denominator;}public static Fraction operator +(Fraction a) => a;public static Fraction operator -(Fraction a) => new Fraction(-a.num, a.den);public static Fraction operator +(Fraction a, Fraction b)=> new Fraction(a.num * b.den + b.num * a.den, a.den * b.den);public static Fraction operator -(Fraction a, Fraction b)=> a + (-b);public static Fraction operator *(Fraction a, Fraction b)=> new Fraction(a.num * b.num, a.den * b.den);public static Fraction operator /(Fraction a, Fraction b){if (b.num == 0){throw new DivideByZeroException();}return new Fraction(a.num * b.den, a.den * b.num);}public override string ToString() => $"{num} / {den}";
}public static class OperatorOverloading
{public static void Main(){var a = new Fraction(5, 4);var b = new Fraction(1, 2);Console.WriteLine(-a); // output: -5 / 4Console.WriteLine(a + b); // output: 14 / 8Console.WriteLine(a - b); // output: 6 / 8Console.WriteLine(a * b); // output: 5 / 8Console.WriteLine(a / b); // output: 10 / 4}
}
参考讲解实例,老师讲得非常好,希望大家多多关注ub主
c shape c# 自定义隐式转换与运算符重载_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rg411A7QU/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=e821a225c7ba4a7b85e5aa6d013ac92e
特此记录
anlog
2023年2月11日
相关文章:

c# 自定义隐式转换与运算符重载
用户定义的显式和隐式转换运算符 参考代码 用户定义的显式和隐式转换运算符 - 提供对不同类型的转换 | Microsoft Learn 代码例程 using System;public readonly struct Digit {private readonly byte digit;public Digit(byte digit){if (digit > 9){throw new Argumen…...

【MyBatis】| MyBatis的逆向⼯程
目录 一:MyBatis的逆向⼯程 1. 逆向⼯程配置与⽣成 2. 测试生成的逆向⼯程 一:MyBatis的逆向⼯程 (1)所谓的逆向⼯程是:根据数据库表逆向⽣成Java的pojo类,SqlMapper.xml⽂件,以及Mapper接⼝…...
Python|每日一练|哈希表|罗马数字|图算法|圆周率|单选记录:给定数列和|罗马数字转整数|计算圆周率
1、要求编写函数fn(a,n) 求aaaaaa⋯aa⋯aa(n个a)之和,fn须返回的是数列和(算法初阶) 要求编写函数fn(a,n) 求aaaaaa⋯aa⋯aa(n个a)之和,fn须返回的是数列和。 从控制台输入正整数a和n的值(两…...

分布式之分布式事务V2
写在前面 本文一起来看下分布式环境下的事务问题,即我们经常听到的分布式事务问题。想要解决分布式事务问题,需要使用到分布式事务相关的协议,主要有2PC即两阶段提交协议,TCC(try-confirm-cancel)…...

算法笔记(二)—— 认识N(logN)的排序算法
递归行为的时间复杂度估算 整个递归过程是一棵多叉树,递归过程相当于利用栈做了一次后序遍历。 对于master公式,T(N)表明母问题的规模为N,T(N/b)表明每次子问题的规模,a为调用次数,加号后面表明,除去调用之…...
最长湍流子数组——滚动窗口,双指针,暴力求解
978. 最长湍流子数组难度中等216收藏分享切换为英文接收动态反馈给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。更正式地来说,当 arr 的子数组 A[i]…...

45.在ROS中实现global planner(1)
前文move_base介绍(4)简单介绍move_base的全局路径规划配置,接下来我们自己实现一个全局的路径规划 1. move_base规划配置 ROS1的move_base可以配置选取不同的global planner和local planner, 默认move_base.cpp#L70中可以看到是…...

Java中导入、导出Excel——HSSFWorkbook 使用
一、介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要…...
c#数据结构-列表
列表 数组可以管理大量数组,但缺点是无法更变容量。 创建小了不够用,创建大了浪费空间。 无法预测需要多少大小的时候,可能范围越大,就会浪费越多的空间。 所以,你可能会想要一种可以扩容的东西,代替数组…...

Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
文章目录1. Sa-Token 介绍2. 登录认证2.1 登录与注销2.2 会话查询2.3 Token 查询3. 权限认证3.1 获取当前账号权限码集合3.2 权限校验3.3 角色校验4. 前后台分离(无Cookie模式)5. Sa-Token 集成 Redis6. SpringBoot 集成 Sa-Token6.1 创建项目6.2 添加依…...

leaflet显示高程
很多地图软件都能随鼠标移动动态显示高程。这里介绍一种方法,我所得出的。1 下载高程数据一般有12.5m数据下载,可惜精度根本不够,比如mapbox的免费在线的,或者91卫图提供百度网盘打包下载的,没法用,差距太大…...

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析
目录 一、单选题(共25题,共50分) 二、判断题(共10题,共20分) 三、编程题(共3题,共30分) 青少年软件编程(图形化)等级考试试卷(三级) 一、单选题(共25题,共50分) 1. 默认小猫角色…...

ubuntu 驱动更新后导致无法进入界面
**问题描述: **安装新ubuntu系统后未禁止驱动更新导致无法进入登录界面。 解决办法: 首先在进入BIOS中,修改设置以进行命令行操作,然后卸载已有的系统驱动,最后安装新的驱动即可。 开机按F11进入启动菜单栏…...

解决访问GitHub时出现的“您的连接不是私密连接”的问题!
Content问题描述解决办法问题描述 访问github出现您的连接不是私密连接问题,无法正常访问,如下图所示: 解决办法 修改hosts文件。hosts文件位于:C:\Windows\System32\drivers\etc\hosts 首先在https://www.ipaddress.com/查找两…...

初识数据仓库
一、什么是数据仓库数据库 --> OLTP:(on-line transaction processing)翻译为联机事务处理记录某类业务事件的发生,如购买行为,银行交易行为,当行为产生后,系统会记录是谁在何时何地做了何事…...
FilenameUtils工具类部分源码自研
FilenameUtils工具类部分源码自研getExtension(orgFileName)源码如下逐行分析getExtension(orgFileName)源码如下 public class FilenameUtils {public static int indexOfExtension(String fileName) throws IllegalArgumentException {if (fileName null) {return -1;} els…...

【前端领域】3D旋转超美相册(HTML+CSS)
世界上总有一半人不理解另一半人的快乐。 ——《爱玛》 目录 一、前言 二、本期作品介绍 3D旋转相册 三、效果展示 四、详细介绍 五、编码实现 index.html style.css img 六、获取源码 公众号获取源码 获取源码?私信?关注?点赞&…...

Java——聊聊JUC中的原子变量类
文章目录: 1.什么是原子变量类? 2.AtomicInteger(基本类型原子变量类) 3.AtomicIntegerArray(数组类型原子变量类) 4.AtomicMarkableReference(引用类型原子变量类) 5.AtomicInteger…...

elasticsearch索引与搜索初步
ES支持cURL交互,使用http请求完成索引和搜索操作,最基本的格式如下:创建索引我们可以使用PUT方法创建索引,通过指定“索引”、“类型”、“文档ID”锁定文档,通过参数指定文档的数据。红色部分的路由分别指定了“索引”…...
【Python】多线程与多进程学习笔记
本文是一篇学习笔记,学习内容主要来源于莫凡python的文档:https://mofanpy.com/tutorials/python-basic/threading/thread 多线程 线程基本结构 开启子线程的简单方式如下: import threadingdef thread_job():print(This is a thread of %…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...