c# implicit explicit关键字(隐式和显式数据类型转换)
2023-09-11 14:22:02 时间
c# implicit explicit关键字(隐式和显式数据类型转换)
implicit关键字用于声明隐式的用户定义类型转换运算符。(explicit反之)explicit则用于显示转换用户自定义类型。
static implicit operator target_type ( source_type identifier ){......}
隐式转换可以通过消除不必要的类型转换来提高源代码的可读性。但是,因为可以在未指定的情况下发生隐式转换,因此必须注意防止令人不愉快的后果。
一般情况下,隐式转换运算符应当从不引发异常并且从不丢失信息,以便可以在不知晓的情况下安全使用它们。如果转换运算符不能满足那些条件,则应将其标记为 explicit 作为显示转换数据。
下边是在网上找的几个简单例子
例1
class Digit { public Digit(double d) { val = d; } public double val; // User-defined conversion from Digit to double public static implicit operator double(Digit d) { return d.val; } // User-defined conversion from double to Digit public static implicit operator Digit(double d) { return new Digit(d); } } class Program { static void Main(string[] args) { Digit dig = new Digit(7); //This call invokes the implicit "double" operator double num = dig; //This call invokes the implicit "Digit" operator Digit dig2 = 12; Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val); Console.ReadLine(); } }
例2
//基本数据类型到用户自定义类型 class Distance { private int feet; private double inches; //默认构造函数 public Distance() { feet = 0; inches = 0.0; } //带有单参数的构造函数 public Distance(double metres) { double f; f = 3.28 * metres; this.feet = (int)f; this.inches = 12 * (f - feet); } //由一个double隐式构造一个Distance public static implicit operator Distance(double metres) { return new Distance(metres); } //由一个Distance显式返回一个double public static explicit operator double(Distance d) { double metres; metres = d.inches / 12 + (double)d.feet; return (metres / 3.28); } public override string ToString() { return String.Format("{0}英尺{1}英寸 ", this.feet, this.inches); } } class DistanceDemo { public static void Main() { Distance d1 = 1.25; Console.WriteLine(d1); double d = (double)d1; Console.WriteLine(d); } }
例3
using System; namespace Hunts.Keywords { // 定义一个人民币结构。数据类型转换的语法对于结构和类是一样的 public struct RMB { // 注意:这些数的范围可能不能满足实际中的使用 public uint Yuan; public uint Jiao; public uint Fen; public RMB(uint yuan, uint jiao, uint fen) { if (fen > 9) { jiao += fen / 10; fen = fen % 10; } if (jiao > 9) { yuan += jiao / 10; jiao = jiao % 10; } this.Yuan = yuan; this.Jiao = jiao; this.Fen = fen; } public override string ToString() { return string.Format("¥{0}元{1}角{2}分", Yuan, Jiao, Fen); } // 一些操作 public static RMB operator +(RMB rmb1, RMB rmb2) { return new RMB(rmb1.Yuan + rmb2.Yuan, rmb1.Jiao + rmb2.Jiao, rmb1.Fen + rmb2.Fen); } public static implicit operator float(RMB rmb) { return rmb.Yuan + (rmb.Jiao / 10.0f) + (rmb.Fen / 100.00f); } public static explicit operator RMB(float f) { uint yuan = (uint)f; uint jiao = (uint)((f - yuan) * 10); uint fen = (uint)(((f - yuan) * 100) % 10); return new RMB(yuan, jiao, fen); } // more } class App { static void Main() { RMB r1, r2, r3, r4; // 记得小学时的某次捐款,我把口袋里藏好的一块钱加6张一毛钱以及13个一分钱的硬币都贡献出去了:( r1 = new RMB(1, 6, 13); // 其实当时其他人都已经交过了,他们总共交了: r2 = new RMB(46, 9, 3); // 那么加上我的就是: r3 = r1 + r2; Console.WriteLine("r3 = {0}", r3.ToString()); // 隐式转换 float f = r3; Console.WriteLine("float f= {0}", f); // 显式转换 r4 = (RMB)f; Console.WriteLine("r4 = {0}", r4.ToString()); //如果不进行显示转换,将出现错误 CS0266: 无法将类型“float”隐式转换为“Hunts.Keywords.RMB”。存在一个显式转换(是否缺少强制转换?) Console.Read(); } } }
出处:http://www.cnblogs.com/chengxiaohui/articles/1914190.html
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。
如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,求打 付款后有任何问题请给我留言!!!
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【Jack_孟】!
相关文章
- c# 抽象类+特性 验证QQ,Mobile,Name的通用写法
- C# 任意类型数据转JSON格式
- How To Bind a Combobox to a Dictionary in WPF C#
- C#创建继承的窗体
- 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span。 给萌新的Flexbox简易入门教程 浅谈Quartz定时任务调度 浅谈JavaScript之Event(上篇) 探索JavaScript数组奥秘 【详解JavaScript系列】JavaScript之函数(一) C# Oracle.ManagedDataAccess 批量更新表数据 VS2015常用快捷键总结
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
- 使用C#或javascript将Table里的数据导出到Excel
- ADO.NET 对数据操作 以及如何通过C# 事务批量导入数据
- C# IL DASM 使用-破解c#软件方法
- Word控件Spire.Doc 转换教程(二十四):在C#中将Word 转换为SVG
- Word处理控件Aspose.Words功能演示:如何在 C# 中将 Word 转换为 JSON
- C#学习记录——OOP技术:对象的特性
- asp.net, c# 查询大于某一时间的数据, sql语句 用于SQLServer(mssql)
- c# 确定dynamic类型的数据对象是否存在某个属性
- C#【必备技能篇】从Excel复制数据粘贴到DataGridView的代码实现
- C#,K-均值(K-Means)聚类算法的核心源代码
- C#,入门教程(23)——数据类型转换的一点基础知识
- C#,入门教程(38)——大型工程软件中类(class)修饰词partial的使用方法
- C#,入门教程(26)——数据的基本概念与使用方法
- Visual C#实现HTTP代理服务程序
- C# 运算符与表达式
- C# Winform datagridview 列 DataGridViewCheckBoxColumn 复选框,没办法选择
- 使用二进制实现本地数据保存和读取(C# , Unity)
- C#访问Excel数据
- C#-初识IntPtr
- C#分块读取文本数据(FileStream)
- 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其一)
- C# 非递归生成树 10万+数据的一个递归 简化版
- C# await async Task
- C# 请求数据 模拟多文件上传
- 接口 C# 请求数据 HttpWebRequest 错误总结