【5min+】 什么?原来C#还有这两个关键字

系列介绍

简介

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

场景

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

诞生原因

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

文章质量

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

正文

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

who

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

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

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

key

它究竟是个什么东西

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

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

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

来看它的用途

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

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;

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

s

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

结束

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

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

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

相关文章
相关标签/搜索