系列介绍

简介

【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。

场景

您可以在下班坐地铁的时候,拿出手机逛一逛博客园,利用短短的五分钟完成阅读。

诞生缘由

  • 曾经学过的内容可能过不了多久就忘了,我们需要一些文章来帮我们查漏补缺。
  • 太长篇幅的文章看着滚动条就害怕了,我们可能更期望文字少的文章。
  • .net体系的内容太多了,平时也不知道该学哪些,我们可能需要一点点知识线索。

文章质量

当然,并不意味着它篇幅短就质量差。所谓麻雀虽小五脏俱全,我们会尽可能保证利用最少的文字去详细的阐述内容。

正文

好吧,直接开们见山来介绍今天的主角:ExplicitImplicit

我记得我第一次见到这两个关键字还是在一次C#基础测试中。当时已经入C#的坑有两年多了吧,自认为基础的题应该不在话下吧。

然后小手一点视频网页上的进行测试按钮,请听题:“请问Explicit的作用是什么?”。我:“%……&……,这他喵的什么东西?是C#的东西?”。

后来在公司问了一些老鸟,好像大家也并不知道这两个关键字,毕竟它和staticoperator这些大佬比起来,真的太不显眼了。

它到底是个什么东西

先来直接看一下msdn对它的解释吧:

explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符

是的,它就是一个类型转换的语法糖。explicitImplicit的作用其实是一样的,它们之间的区别其实仅仅是显示转换和隐式转换的区别。

来看它的用途

这是我在项目中用到的一处场景,我建立了一个时间段类,里面包含了时间段的开始时间和结束时间。代码大致是酱紫:

public class DateTimeRange
{
public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
}
}

在实际的使用场景中,我们项目里往往会去获取这个时间段类的小时数。

 (timeRange.EndTime - timeRange.StartTime).TotalHours;

是的,一开始我们就是酱紫写的。但是写起来很不爽,每次都要复制N次。然后提取成了一个方法,GetRangeHours()。但是你懂的,一旦程序员懒起来,它会连GetRangeHours都不想写(虽然VS会给你提示,一般只需要按两三次键盘)。所以后来就有了这个版本:

public class DateTimeRange
{
public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
} //operator 后面跟需要转换的类型
public static implicit operator double(DateTimeRange timeRange)
{
return (timeRange.EndTime - timeRange.StartTime).TotalHours;
}
}

然后使用起来就成了这样:

double hours = timeRange;

我*,就是这么洒脱。如果不懂这个关键字的同事阅读到这儿,它可能还会很懵逼:“我擦,这个类型明明不是那个类型啊,那个类型又怎么成了这个类型,它们怎么还能等于起来……………………”。此时的你,只能对他微微一笑。

想一想你会在什么场景使用该关键字呢?DTO转换?已有代码不能变更只能扩展?…………

结束

implicitExplicit都是起到类型转换的作用,它们的区别是转换的时候一个需要显式转换而已,刚才我们那个场景用了隐式转换,如果是显式转换的话就需要 double hours = (double)timeRange; 来写了。

该关键字只能在类内部使用哦,放心,强大的VS会给你提示。

希望本篇文章没有花费您太长的阅读时间。来波关注,咱们下次再见(ง •_•)ง

【5min+】 什么?原来C#还有这两个关键字的更多相关文章

  1. Java中的两个关键字——super、this

    Java中的两个关键字——super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...

  2. OC中两个关键字的作用:@property和@synthesize

    两个关键字的使用:@property和@synthesize 一.@property关键字这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 ...

  3. linux用grep查找包含两个关键字的命令

    linux用grep查找包含两个关键字的命令 http://zhidao.baidu.com/link?url=VsFxeJXmU7W7hy1UH7eT6QAbUsVz9Ru2ABPuWYHWm4kB ...

  4. 在c#中using和new这两个关键字有什么意义?

    在c#中using和new这两个关键字有什么意义?答:using 引入名称空间或者使用非托管资源, new 新建实例或者隐藏基类方法

  5. *两个关键字static和final

    static关键字:可以用于修饰属性,也可以用于修饰方法,还可以用于修饰类. static 修饰属性: 无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量 ...

  6. this&super两个关键字的意义和用法

    "this",作为一个特殊的关键字,它的规则如下: 1.可以表示构造函数传递.this(a,b)表示调用另外一个构造函数.这里面的this就是一个特殊语法,不是变量,没有什么类型. ...

  7. struct和class两个关键字的区别

    1. <C++ Primer> 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private. 2. ...

  8. 自动居中标题和内容;aspxgridview允许定义两个关键字为主键的格式

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. Python3 获取一大段文本之间两个关键字之间的内容

    用re或者string.find.以下是re代码 123456789101112131415import re#文本所在TXT文件file = '123.txt' #关键字1,2(修改引号间的内容)w ...

随机推荐

  1. hdu 3635 Dragon Balls (MFSet)

    Problem - 3635 切切水题,并查集. 记录当前根树的结点个数,记录每个结点相对根结点的转移次数.1y~ 代码如下: #include <cstdio> #include < ...

  2. Fish Shell使用心得

    Fish的官网宣传语是 Finally, a command line shell for the 90s. 翻译过来就是 Fish shell 是一个为90后准备的 shell. 有人说:" ...

  3. 开源CMS比较

    PHP-CMS的发展方向:简单,易用,美观  http://www.php-cms.cn/ 看点1,服务器一键安装,鼠标点点就搞定:输入数据库参数,在服务器上点一个按钮就完成全部的安装.简单配置一下网 ...

  4. supersockets支持热更新的服务器实例配置选项

    SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActi ...

  5. halcon坐标转换(机器人坐标转换用)

    #图像坐标r:=[431, 355, 507, 53, 507]c:=[505, 543, 316, 127, 883]#物理坐标(例如机器人坐标)r1:=[0, 2.0, -2.0, 10, -2. ...

  6. PPP验证对比

  7. 谷歌浏览器中kindeditor编译器字体不能为微软雅黑的问题?

    https://segmentfault.com/q/1010000006204144 比如说用谷歌浏览器打开后台编译文章,在文章先选择字体为微软雅黑,再编辑其他,哪个字体就变成了&quot: ...

  8. Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow pip命令

    引言: Tensorflow大名鼎鼎,这里不再赘述其为何物.这里讲描述在安装python包的时候碰到的“No matching distribution found for tensorflow”,其 ...

  9. linux内核符号表

    我们已经看到 insmod 如何对应共用的内核符号来解决未定义的符号. 表中包含了全局内 核项的地址 -- 函数和变量 -- 需要来完成模块化的驱动. 当加载一个模块, 如何由模块 输出的符号成为内核 ...

  10. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(5)之业务层

    业务层主要负责定义业务逻辑(规则.工作流.数据完整性等),接收来自表示层的数据请求,逻辑判断后,向数据访问层提交请求,并传递数据访问结果,业务逻辑层实际上是一个中间件,起着承上启下的重要作用. 在我们 ...