一、explicit和implicit

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

总结来说:explicit和implicit都是用于用户自定义的类型转换运算符,explicit是显示转换,implicit是隐式转换。

二、explicit和Implicit的使用

我们建立一个时间段类,里面包含了时间段的开始时间和结束时间,而实际使用中,往往需要去获取这个时间段类的小时数。代码如下:

  /// <summary>
/// 时间类
/// </summary>
public class DateTimeRange
{
//开始时间
public DateTime StartTime { get; set; } //结果时间
public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
} //计算时间差(小时)
public static double GetHourRang(DateTimeRange timeRange)
{
return (timeRange.EndTime - timeRange.StartTime).TotalHours;
}
}

而使用的时候都要调用GetRangeHours方法把DateTimeRange类转换成时间差的类型double,代码如下:

   static void Main(string[] args)
{
DateTimeRange timeRange = new DateTimeRange(new DateTime(, , , , , ), DateTime.Now);
double hours = DateTimeRange.GetHourRang(timeRange);
Console.WriteLine($"时间差:{hours}"); Console.ReadKey();
}

为了省略每次都调用GetRangeHours方法,我们使用关键字explicit和implicit,而explicit和implicit往往搭配operation使用。

1:使用implicit关键字代码如下:

  /// <summary>
/// 时间类
/// </summary>
public class DateTimeRange
{
//开始时间
public DateTime StartTime { get; set; } //结果时间
public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
} //计算时间差(小时)
public static implicit operator double(DateTimeRange timeRange)
{
return (timeRange.EndTime - timeRange.StartTime).TotalHours;
}
} class Program
{
static void Main(string[] args)
{
//隐式转换(DateTimeRange=>double)
double hours = new DateTimeRange(new DateTime(, , , , , ), DateTime.Now);
Console.WriteLine($"时间差:{hours}"); Console.ReadKey();
}
}

2:使用explicit关键字代码如下:

  /// <summary>
/// 时间类
/// </summary>
public class DateTimeRange
{
//开始时间
public DateTime StartTime { get; set; } //结果时间
public DateTime EndTime { get; set; } public DateTimeRange(DateTime startTime, DateTime endTime)
{
StartTime = startTime;
EndTime = endTime;
} //计算时间差(小时)
public static explicit operator double(DateTimeRange timeRange)
{
return (timeRange.EndTime - timeRange.StartTime).TotalHours;
}
} class Program
{
static void Main(string[] args)
{
//显示式转换(DateTimeRange=>double),必须显示转换,否则,会编译报错
double hours = (double)new DateTimeRange(new DateTime(, , , , , ), DateTime.Now);
Console.WriteLine($"时间差:{hours}"); Console.ReadKey();
}
}

三、explicit和Implicit的总结

    explicit和implicit都是应用于用户自定义类型转换运算符,两者的区别如下:

(1) 使用explicit关键字,则进行类型转换时必须显示声明,如果转换操作会导致异常或丢失信息,则应将其标记为 explicit。 这可阻止编译器静默调用可能产生意外后果的转换操作;

(2) 使用impilit关键字,则进行类型转换时可以隐式声明,如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。这可以通过消除不必要的强制转换来提高源代码的可读性。

引用文章:https://www.cnblogs.com/uoyo/p/12157709.html

C#的关键字Explicit 和 Implicit的更多相关文章

  1. operator、explicit与implicit

    说这个之前先说下什么叫隐式转换和显示转换 1.所谓隐式转换,就是系统默认的转换,其本质是小存储容量数据类型自动转换为大存储容量数据类型. 例如:float f = 1.0: double d=f:这样 ...

  2. C#中转换运算符explicit、implicit、operator、volatile研究

    C#中的这个几个关键字:explicit.implicit与operator,估计好多人的用不上,什么情况,这是什么?字面解释:explicit:清楚明白的;易于理解的;(说话)清晰的,明确的;直言的 ...

  3. 关键字explicit的作用(转)

    C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...

  4. C++关键字 explicit

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. C++中, 一个参数的构造函数(或者除了第一个参数 ...

  5. C++ 关键字 explicit, export, mutable

    转自 explicit 如果A类有某个构造函数的单个输入参数,是B类(包括基本数据类型)的对象或引用,则C++的编译器会在需要A类形参的函数调用中,自动调用该构造函数,将B类实参隐式地转换为A类实参. ...

  6. 关键字explicit

    今天在<C++ Standard Library>中看到 explicit 的作用,在这里做一下笔记,以备下次再次忘记该关键字的作用. By using the keyword expli ...

  7. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

    最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前 ...

  8. C# 显式转换关键字 explicit

    不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...

  9. c/c++拷贝构造函数和关键字explicit

    c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...

随机推荐

  1. CF-552E-Two Teams

    pro:给出n, k和长度为n的数组a, 两个人轮流取数1先取,设a[i]是当前数组中最大值,则取走a[i - k]到a[i + k]这段数,然后把a[i + k + 1]和后面的补到 a[i - k ...

  2. hosts原理及作用

    https://blog.csdn.net/qq_41356488/article/details/82190372 手机也可以修改hosts,但是需要root权限,百度

  3. 浏览器证书问题,chorm,ie,edge,safari都会去读系统证书,firefox例外

    坑爹 没想过浏览器兼容的问题. 为系统安装用户证书后, firefox一直无法连接 提示 连接 www.httpsserver.com:8985 时发生错误. SSL 对等端无法协商出一个可接受的安全 ...

  4. ServletContextListener 监听器

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...

  5. http、https的压测工具——apacheab 、webbench

    http的压测工具 搞清楚不同的安装方法,执行文件.配置文件的路径. yum安装: 执行文件在/usr/bin 下,一般为执行文件 配置文件在/etc目录下 conf文件 源码安装: 执行文件在安装文 ...

  6. Java IO: OutputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) OutputStream类是Java IO API中所有输出流的基类.子类包括Buffere ...

  7. Java 中Enum的使用与分析

    https://www.cnblogs.com/softidea/p/3760235.html https://blog.csdn.net/qq_27093465/article/details/52 ...

  8. c++入门资源

    http://www.cnblogs.com/jackyyang7/articles/2479482.htmlvs2010编译器的使用 https://www.cnblogs.com/me115/ar ...

  9. 烧光百亿的共享单车行业,ofo和摩拜到底该不该合并?

    共享经济领域可谓一地鸡毛,除了众多不靠谱的跟风项目外--共享马扎."老公寄存屋",更多的是不绝于耳的倒闭消息.尤其是在共享单车行业,暂且不提那些体量小的项目,单单是倒闭的大型共享单 ...

  10. “淘宝技术这十年”

    "少时淘气,大时淘宝" 时势造英雄 起因eBay 易趣 在资本方面对仗,阿里想趁此崛起新项目就要求能在短时间内做出一个 个人对个人的商品交易网站(C2C)2003年4月7日-5月1 ...