【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 ...
随机推荐
- xml path 列转行实例
SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...
- Python--day72--ajax简介
ajax的基本结构: <script> $("#b1").on("click", function () { $.ajax({ url: " ...
- HDU 1026 BSF+优先队列+记录路径、
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #inclu ...
- python开启GPU加速
看了好多教程都提到了使用 os.environ["CUDA_VISIBLE_DEVICES"] = "1" 或者export CUDA_VISIBLE_DEVI ...
- 2016年NOIP普及组复赛题解
题目涉及算法: 买铅笔:入门题: 回文日期:枚举: 海港:双指针: 魔法阵:数学推理. 买铅笔 题目链接:https://www.luogu.org/problem/P1909 设至少要买 \(num ...
- JPA多对一单向关联
在实际开发过程中,JPA多对一单向关联是使用最多的关联方式. 下面是订单与订单项的配置关系. 订单(Order):一的一方,不进行任何配置 @Entity @Table(name="orde ...
- Python--day32--struct模块
struct模块:该模块可以把一个类型,如数字,转成固定长度的bytes
- H3CSTP、RSTP的问题
- 【GYM102091】2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest
A-Evolution Game 题目大意:有$n$个不同的野兽,定义第$i$ 个野兽有 $i$ 个眼睛和 $h[i]$ 个角,你可以任意从中选择一个野兽进行进化,每次进化角数量必须增加,而且进化后要 ...
- Linux 内核PCI 中断
对于中断, PCI 是容易处理的. 在 Linux 启动时, 计算机的固件已经分配一个唯一的中 断号给设备, 并且驱动只需要使用它. 中断号被存储于配置寄存器 60 (PCI_INTERRUPT_LI ...