如何在 C# 中使用隐式和显式操作符
C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符
实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式
和 隐式
操作符。
什么是显式,什么是隐式
隐式类型转换
它是运行时自动帮你完成的,言外之意就是你不需要人为干预,比如下面的例子就是典型的 隐式类型转换
。
int x = 100;
double d = x;
不过下面的代码则过不了编译器。
double d = 100.25;
int x = d;
编译程序时,将会出现下面的错误。
显而易见,上面的 double 不能隐式的转成 int,除非显式转换,那如何显式呢?可以使用如下代码。
int x = 100;
double d = (int) x;
人工干预后,编译器也就放行了。
创建 DTO 类
接下来我们研究一下如何在 用户自定义类型
上使用 隐式 和 显式转换,比如:Class,考虑下面的类。
public class Author{public Guid Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }}public class AuthorDto{public string Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }}
在上面的代码中,定义了一个 Author
实体类,然后再为 Author
定义一个数据传输对象 AuthorDTO
,数据传输对象是一个数据容器,常用于在 Presentation 和 Application层 之间传递数据。
Model 和 DTO 之间的相互转换
下面的代码展示了如何实现 Author 和 AuthorDto 之间的相互转换。
public AuthorDto ConvertAuthorToAuthorDto(Author author){AuthorDto authorDto = new AuthorDto{Id = author.Id.ToString(),FirstName = author.FirstName,LastName = author.LastName};return authorDto;}public Author ConvertAuthorDtoToAuthor(AuthorDto authorDto){Author author = new Author{Id = Guid.Parse(authorDto.Id),FirstName = authorDto.FirstName,LastName = authorDto.LastName};return author;}
如果需要在应用程序中为若干个类写这样的转换代码,你会发现实现类之间的转换使的代码比较冗余,而且代码可读性也好不到哪里去。所以在这种场景下就是 显式
和 隐式
操作符的用武之地。
使用隐式操作符
实现 model-dto
之间的转换更简单粗暴的方式就是使用 隐显式操作符
,这样就避免了冗长的方法调用,让代码更加的直截了当。
下面的代码展示了如何使用 隐式操作符
将 Author实例 转成 AuthorDto 实例。
public static implicit operator AuthorDto(Author author)
{AuthorDto authorDto = new AuthorDto();authorDto.Id = author.Id.ToString();authorDto.FirstName = author.FirstName;authorDto.LastName = author.LastName;return authorDto;
}
接下来看一下如何在 Main 方法中使用 隐式操作符
。
static void Main(string[] args)
{Author author = new Author();author.Id = Guid.NewGuid();author.FirstName = "Joydip";author.LastName = "Kanjilal";AuthorDto authorDto = author;Console.ReadKey();
}
使用显式操作符
下面的代码展示了如何利用 显式操作符
将 Author 实例转成 AuthorDto 。
public static explicit operator AuthorDto(Author author)
{AuthorDto authorDto = new AuthorDto();authorDto.Id = author.Id.ToString();authorDto.FirstName = author.FirstName;authorDto.LastName = author.LastName;return authorDto;
}
这时候在 Main 方法中就需要人工介入进行强转了,如下代码所示:
static void Main(string[] args)
{Author author = new Author();author.Id = Guid.NewGuid();author.FirstName = "Joydip";author.LastName = "Kanjilal";AuthorDto authorDto = (AuthorDto)author;Console.ReadKey();
}
值得注意的是,你不能在一个类中的对象转换同时定义 显式 和 隐式操作符
,如下图所示:
如果你定义了隐式操作符
,那么对象之间的转换可以是隐式或显式,如果你定义了显式操作符
,那么你只能显式的实现对象转换,虽然隐式操作
使用起来非常方便,但显式操作会让代码意图更明显,可读性更高。
译文链接:https://www.infoworld.com/article/3606436/how-to-use-implicit-and-explicit-operators-in-csharp.html
如何在 C# 中使用隐式和显式操作符相关推荐
- 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化
人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...
- android oreo_Android Oreo隐式和显式广播接收器
android oreo In this tutorial, we'll discuss the changes in Broadcast Receiver since Android Oreo. W ...
- intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系
intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...
- 5-Selenium WebDriver三种等待--隐式等待-显式等待和流畅等待
在selenium中,Waits在执行测试中扮演重要角色.在本教程中,您将学习Selenium中"隐式"和"显式"等待的各个方面. 在Selenium中为什么需 ...
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
{"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值"} 对于这个异常可以从两个角度来处理:A:数据库执行语句 B: ...
- sqlserver 插入数据时异常,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXXXX.dbo.XXXXXXXXX'中的标识列指定显式值。...
INSERT INTO XXXXXXXXX.dbo.XXXXXXXXX select * from XXXXXXXXX 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'X ...
- 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题...
今天在处理数据库过程中碰到这样的问题在插入一条数据到表中 系统报这样的错误 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题 表有一列是自增长的 ...
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'WLog' 中的标识列插入显式值。
在使用SQLServer数据库的时候,在进行数据报错过程中,出现如下异常: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'WLog' 中的标识列插入显式值. 当前表没有设置关联关 ...
- CAE 分析中 隐式和显式时间积分算法的python程序实现
前两天,同事研究Dyna的显/隐式时间积分的差异和基本原理.想来自己也有三.四年没做这方面的编程了,对同事问的一些问题也一时犯迷瞪,索性就又看了一遍书,网上找了些资料,写了点代码,理了理思路,以备不时 ...
最新文章
- postgresql数据库修改表
- Riak VClock
- Angular下通过命令创建组件至指定文件夹下
- 使用C#开发交互式命令行应用
- C++ 的 RTTI
- Linux编译安装GCC-5.1.0
- 深度森林:常见Warning及解决方案
- matlab 正20面体,求正十二面体和正二十面体的相邻两个表面的二面角大小
- 【ElasticSearch系列连载】1. ES版本与开源简介
- 2020年12月编程语言排行榜
- 扫地机器人系统,主要划分为哪几个模块?
- 工控协议(二):Modbus TCP/IP 学习笔记
- Android开发-Notification通知栏通知最基础运用
- 单精度(float) 双精度 (double) 区别
- [轻松一下] 大热天的宿舍太热了,来网吧敲代码
- 在apache中运行 cgi程序
- 【笔记】三剑客之sed、grep sort uniq
- 数学建模笔记-第十四讲-主成分分析
- feng 的模块(框架)以及运作过程
- 安保人脸识别技术与视频监控系统的结合应用
热门文章
- 《子弹笔记术》[日]杉野干人(作者)epub+mobi+azw3格式下载
- python之_init_函数的简介
- webjars管理静态资源
- BitMap位图与海量数据的理解与应用
- C++设计模式之工厂模式(1)
- Spark技术内幕: Task向Executor提交的源代码解析
- 线上问题随笔记录数据库连接池问题
- linux进阶命令2
- #if defined(__cplusplus)
- UVa1607 poj1435 UVaLive1686 Gates