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

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# 自定义隐式转换与运算符重载_哔哩哔哩_bilibiliicon-default.png?t=N176https://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的逆向⼯程

目录 一&#xff1a;MyBatis的逆向⼯程 1. 逆向⼯程配置与⽣成 2. 测试生成的逆向⼯程 一&#xff1a;MyBatis的逆向⼯程 &#xff08;1&#xff09;所谓的逆向⼯程是&#xff1a;根据数据库表逆向⽣成Java的pojo类&#xff0c;SqlMapper.xml⽂件&#xff0c;以及Mapper接⼝…...

Python|每日一练|哈希表|罗马数字|图算法|圆周率|单选记录:给定数列和|罗马数字转整数|计算圆周率

1、要求编写函数fn(a,n) 求aaaaaa⋯aa⋯aa(n个a&#xff09;之和&#xff0c;fn须返回的是数列和&#xff08;算法初阶&#xff09; 要求编写函数fn(a,n) 求aaaaaa⋯aa⋯aa(n个a&#xff09;之和&#xff0c;fn须返回的是数列和。 从控制台输入正整数a和n的值&#xff08;两…...

分布式之分布式事务V2

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

算法笔记(二)—— 认识N(logN)的排序算法

递归行为的时间复杂度估算 整个递归过程是一棵多叉树&#xff0c;递归过程相当于利用栈做了一次后序遍历。 对于master公式&#xff0c;T(N)表明母问题的规模为N&#xff0c;T(N/b)表明每次子问题的规模&#xff0c;a为调用次数&#xff0c;加号后面表明&#xff0c;除去调用之…...

最长湍流子数组——滚动窗口,双指针,暴力求解

978. 最长湍流子数组难度中等216收藏分享切换为英文接收动态反馈给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。更正式地来说&#xff0c;当 arr 的子数组 A[i]…...

45.在ROS中实现global planner(1)

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

Java中导入、导出Excel——HSSFWorkbook 使用

一、介绍 当前B/S模式已成为应用开发的主流&#xff0c;而在企业办公系统中&#xff0c;常常有客户这样子要求&#xff1a;你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是&#xff1a;我们已经习惯用Excel打印。这样在我们实际的开发中&#xff0c;很多时候需要…...

c#数据结构-列表

列表 数组可以管理大量数组&#xff0c;但缺点是无法更变容量。 创建小了不够用&#xff0c;创建大了浪费空间。 无法预测需要多少大小的时候&#xff0c;可能范围越大&#xff0c;就会浪费越多的空间。 所以&#xff0c;你可能会想要一种可以扩容的东西&#xff0c;代替数组…...

Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)

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

leaflet显示高程

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

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共3题&#xff0c;共30分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;三级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 默认小猫角色…...

ubuntu 驱动更新后导致无法进入界面

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

解决访问GitHub时出现的“您的连接不是私密连接”的问题!

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

初识数据仓库

一、什么是数据仓库数据库 --> OLTP&#xff1a;&#xff08;on-line transaction processing&#xff09;翻译为联机事务处理记录某类业务事件的发生&#xff0c;如购买行为&#xff0c;银行交易行为&#xff0c;当行为产生后&#xff0c;系统会记录是谁在何时何地做了何事…...

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 六、获取源码 公众号获取源码 获取源码&#xff1f;私信&#xff1f;关注&#xff1f;点赞&…...

Java——聊聊JUC中的原子变量类

文章目录&#xff1a; 1.什么是原子变量类&#xff1f; 2.AtomicInteger&#xff08;基本类型原子变量类&#xff09; 3.AtomicIntegerArray&#xff08;数组类型原子变量类&#xff09; 4.AtomicMarkableReference&#xff08;引用类型原子变量类&#xff09; 5.AtomicInteger…...

elasticsearch索引与搜索初步

ES支持cURL交互&#xff0c;使用http请求完成索引和搜索操作&#xff0c;最基本的格式如下&#xff1a;创建索引我们可以使用PUT方法创建索引&#xff0c;通过指定“索引”、“类型”、“文档ID”锁定文档&#xff0c;通过参数指定文档的数据。红色部分的路由分别指定了“索引”…...

【Python】多线程与多进程学习笔记

本文是一篇学习笔记&#xff0c;学习内容主要来源于莫凡python的文档&#xff1a;https://mofanpy.com/tutorials/python-basic/threading/thread 多线程 线程基本结构 开启子线程的简单方式如下&#xff1a; import threadingdef thread_job():print(This is a thread of %…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...