【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 = (DateTimeRange)timeRange; 来写了。
该关键字只能在类内部使用哦,放心,强大的VS会给你提示。
希望本篇文章没有花费您太长的阅读时间。来波关注,咱们下次再见(ง •_•)ง
- 在c#中using和new这两个关键字有什么意义?
- C#中的String和string有什么区别?还有ref关键字怎么用?
- c#中两个问号(??)是什么意思
- C#中进行字符串类型声明时,一个小写 "string ", 一个大写 "String ", 这两个类有什么区别呢?
- C#开发中三层架构BLL,DAL还有IBLL和IDAL接口,请问为什么要定义接口?有什么用啊?
- C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?
- C#中的is关键字原来会做null检查
- C#中的is关键字原来会做null检查
- C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?zz
- C#中的两个关键字ref和out
- C#语法中一个问号(?)和两个问号(??)的运算符是什么意思?
- 原来是这样:C#中new一个对象时,发生了什么事?
- C# 5.0 两个新关键字 async await 在Silverlight中的应用
- 在C#中internal关键字是什么意思?和protected internal区别
- 关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用
- using 和 new 这两个关键字有什么意义?
- C#中internal关键字是什么意思?什么叫做“只能在包含它的程序集中访问该方法”
- C#语法中两个问号(??)的运算符是什么意思?
- c#中的关键字out是什么意思?ref是什么意思?它们有什么区别?
- 你知道C#中的new关键字在声明一个对象时都做什么了吗?