【5min+】 什么?原来C#还有这两个关键字
系列介绍
简介
【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。
场景
您可以在下班坐地铁的时候,拿出手机逛一逛博客园,利用短短的五分钟完成阅读。
诞生缘由
- 曾经学过的内容可能过不了多久就忘了,我们需要一些文章来帮我们查漏补缺。
- 太长篇幅的文章看着滚动条就害怕了,我们可能更期望文字少的文章。
- .net体系的内容太多了,平时也不知道该学哪些,我们可能需要一点点知识线索。
文章质量
当然,并不意味着它篇幅短就质量差。所谓麻雀虽小五脏俱全,我们会尽可能保证利用最少的文字去详细的阐述内容。
正文
好吧,直接开们见山来介绍今天的主角:Explicit 和 Implicit。
我记得我第一次见到这两个关键字还是在一次C#基础测试中。当时已经入C#的坑有两年多了吧,自认为基础的题应该不在话下吧。
然后小手一点视频网页上的进行测试按钮,请听题:“请问Explicit的作用是什么?”。我:“%……&……,这他喵的什么东西?是C#的东西?”。
后来在公司问了一些老鸟,好像大家也并不知道这两个关键字,毕竟它和static、operator这些大佬比起来,真的太不显眼了。
它到底是个什么东西
先来直接看一下msdn对它的解释吧:
explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符
是的,它就是一个类型转换的语法糖。explicit 与 Implicit的作用其实是一样的,它们之间的区别其实仅仅是显示转换和隐式转换的区别。
来看它的用途
这是我在项目中用到的一处场景,我建立了一个时间段类,里面包含了时间段的开始时间和结束时间。代码大致是酱紫:
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转换?已有代码不能变更只能扩展?…………
结束
implicit和Explicit都是起到类型转换的作用,它们的区别是转换的时候一个需要显式转换而已,刚才我们那个场景用了隐式转换,如果是显式转换的话就需要 double hours = (double)timeRange; 来写了。
该关键字只能在类内部使用哦,放心,强大的VS会给你提示。
希望本篇文章没有花费您太长的阅读时间。来波关注,咱们下次再见(ง •_•)ง
【5min+】 什么?原来C#还有这两个关键字的更多相关文章
- Java中的两个关键字——super、this
Java中的两个关键字——super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...
- OC中两个关键字的作用:@property和@synthesize
两个关键字的使用:@property和@synthesize 一.@property关键字这个关键字是OC中能够快速的定义一个属性的方式,而且他可以设置一些值,就可以达到一定的效果,比如引用计数的问题 ...
- linux用grep查找包含两个关键字的命令
linux用grep查找包含两个关键字的命令 http://zhidao.baidu.com/link?url=VsFxeJXmU7W7hy1UH7eT6QAbUsVz9Ru2ABPuWYHWm4kB ...
- 在c#中using和new这两个关键字有什么意义?
在c#中using和new这两个关键字有什么意义?答:using 引入名称空间或者使用非托管资源, new 新建实例或者隐藏基类方法
- *两个关键字static和final
static关键字:可以用于修饰属性,也可以用于修饰方法,还可以用于修饰类. static 修饰属性: 无论一个类生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量:一个对象对该静态成员变量 ...
- this&super两个关键字的意义和用法
"this",作为一个特殊的关键字,它的规则如下: 1.可以表示构造函数传递.this(a,b)表示调用另外一个构造函数.这里面的this就是一个特殊语法,不是变量,没有什么类型. ...
- struct和class两个关键字的区别
1. <C++ Primer> 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct的成员为public,而class的成员为private. 2. ...
- 自动居中标题和内容;aspxgridview允许定义两个关键字为主键的格式
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- Python3 获取一大段文本之间两个关键字之间的内容
用re或者string.find.以下是re代码 123456789101112131415import re#文本所在TXT文件file = '123.txt' #关键字1,2(修改引号间的内容)w ...
随机推荐
- 「POI2012」约会 Rendezvous
#2691. 「POI2012」约会 Rendezvous 这题我简直不想说什么了,什么素质,卡常数…… “每个顶点有且仅有一条出边”,所以是一道基环树的题,首先tarjan缩点,在缩完点后的图上求a ...
- LightOJ 1269 Consecutive Sum (Trie树)
Jan's LightOJ :: Problem 1269 - Consecutive Sum 题意是,求给定序列的中,子序列最大最小的抑或和. 做法就是用一棵Trie树,记录数的每一位是0还是1.查 ...
- Top 10 open source projects of 2015
Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...
- 读取hive的表结构,生成带comment的视图建表语句
### 读取hive的表结构,生成带comment的视图建表语句 # 读取配置文件中的表并进行遍历 grep -v '^#' tablesFile|while read tableName do st ...
- Python--day47--mysql索引注意事项
- PHP IF判断 简写
第一种:IF 条件语句 第二种:三元运算 第三种:&& .|| 组成的条件语句 第一种: IF 基础,相信绝大多数人都会: 第二种: c=a>b ? true:false / ...
- 《Spring 5官方文档》 Spring AOP的经典用法
原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...
- MAMP "403 Forbidden You don't have permission to access / on this server."
2015年01月22日 17:27:31 阅读数:3488 用MAMP搭建本地服务器的时候,设置好ip和端口等属性之后,浏览器访问,报 403错误: Forbidden You don't have ...
- vue-learning:33 - component - 内置组件 - 过渡组件transition
vue内置过渡组件transition 目录 什么是过渡 基本过渡或动画实现的语法 css过渡动画:transition / animation js过渡:特定事件钩子函数 各种情形下的过渡实现,使用 ...
- LuoguP5464 缩小社交圈
LuoguP5464 缩小社交圈 背景:洛谷七月月赛T4 题目大意给定\(n\)个点,每个点的权值对应着一个区间\([l_i,r_i]\),两个点\(i,j\)有边当且仅当他们权值的并集不为空集,问有 ...