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# 中使用隐式和显式操作符相关推荐

  1. 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化

    人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...

  2. android oreo_Android Oreo隐式和显式广播接收器

    android oreo In this tutorial, we'll discuss the changes in Broadcast Receiver since Android Oreo. W ...

  3. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  4. 5-Selenium WebDriver三种等待--隐式等待-显式等待和流畅等待

    在selenium中,Waits在执行测试中扮演重要角色.在本教程中,您将学习Selenium中"隐式"和"显式"等待的各个方面. 在Selenium中为什么需 ...

  5. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值

    {"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值"} 对于这个异常可以从两个角度来处理:A:数据库执行语句  B: ...

  6. sqlserver 插入数据时异常,仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'XXXXX.dbo.XXXXXXXXX'中的标识列指定显式值。...

    INSERT INTO XXXXXXXXX.dbo.XXXXXXXXX select * from XXXXXXXXX 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'X ...

  7. 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题...

    今天在处理数据库过程中碰到这样的问题在插入一条数据到表中 系统报这样的错误 仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表中为标识列指定显式值问题 表有一列是自增长的 ...

  8. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'WLog' 中的标识列插入显式值。

    在使用SQLServer数据库的时候,在进行数据报错过程中,出现如下异常: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'WLog' 中的标识列插入显式值. 当前表没有设置关联关 ...

  9. CAE 分析中 隐式和显式时间积分算法的python程序实现

    前两天,同事研究Dyna的显/隐式时间积分的差异和基本原理.想来自己也有三.四年没做这方面的编程了,对同事问的一些问题也一时犯迷瞪,索性就又看了一遍书,网上找了些资料,写了点代码,理了理思路,以备不时 ...

最新文章

  1. postgresql数据库修改表
  2. Riak VClock
  3. Angular下通过命令创建组件至指定文件夹下
  4. 使用C#开发交互式命令行应用
  5. C++ 的 RTTI
  6. Linux编译安装GCC-5.1.0
  7. 深度森林:常见Warning及解决方案
  8. matlab 正20面体,求正十二面体和正二十面体的相邻两个表面的二面角大小
  9. 【ElasticSearch系列连载】1. ES版本与开源简介
  10. 2020年12月编程语言排行榜
  11. 扫地机器人系统,主要划分为哪几个模块?
  12. 工控协议(二):Modbus TCP/IP 学习笔记
  13. Android开发-Notification通知栏通知最基础运用
  14. 单精度(float) 双精度 (double) 区别
  15. [轻松一下] 大热天的宿舍太热了,来网吧敲代码
  16. 在apache中运行 cgi程序
  17. 【笔记】三剑客之sed、grep sort uniq
  18. 数学建模笔记-第十四讲-主成分分析
  19. feng 的模块(框架)以及运作过程
  20. 安保人脸识别技术与视频监控系统的结合应用

热门文章

  1. 《子弹笔记术》[日]杉野干人(作者)epub+mobi+azw3格式下载
  2. python之_init_函数的简介
  3. webjars管理静态资源
  4. BitMap位图与海量数据的理解与应用
  5. C++设计模式之工厂模式(1)
  6. Spark技术内幕: Task向Executor提交的源代码解析
  7. 线上问题随笔记录数据库连接池问题
  8. linux进阶命令2
  9. #if defined(__cplusplus)
  10. UVa1607 poj1435 UVaLive1686 Gates