一、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方法,我们使用关键字explicitimplicit,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. Django常见错误总结

    1 ImportError: No module named 'MySQLdb' 解决方法: . 安装pymysql模块 . 在app的__init__.py文件中写入以下内容 import pymy ...

  2. iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码

    iOS精选源码 微信自定义搜索框实现 一个商城Demo,持续更新中 在Object-C中学习数据结构与算法之排序算法 iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果 XLsn0wPushTimePi ...

  3. Java中的Properties类

    目录 Java中的Properties类 前言 主要方法 读取Properties文件 相关实例 Java中的Properties类 前言 Java中的Properties类属于配置文件,以键值对的方 ...

  4. SpringBoot webjars 映射

    添加静态资源映射 @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.a ...

  5. 华为OD两轮技术面试

    华为OD面试1性格测试选积极向上的选项,注意,性格测试也会挂人,我一个朋友性格测试就没过.2机试 一道变成题目 1h 用例60%通过即可任给一个数组,元素有20M,1T,300G之类的,其中1T=10 ...

  6. Linux上的软件ClamAV

    ClamAV是使用广泛且基于GPL License的开源代码的典型杀毒软件,它支持各种平台,如:windows.linux.Unix等操作系统,并被广泛应用于其他应用程序,如:邮件客户端服务器.HTT ...

  7. 吴裕雄--python学习笔记:sqlite3 模块的使用与学生信息管理系统

    import sqlite3 cx = sqlite3.connect('E:\\student3.db') cx.execute( '''CREATE TABLE StudentTable( ID ...

  8. Docker学习笔记_04 Rancher的部署安装(编排选用K8S)

    原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...

  9. Linux上SVN安装

    SVN,Subversion,是一个开源的版本控制系统. svn有两种运行方式:独立的服务器和借助apache运行,各有利弊.

  10. hexo博客的学习笔记

    这篇文章主要的作用是作为 .md文件打开,内部的格式为一个初学者对hexo以及markdown语法运用的笔记 1.Hexo的写文格式 最开始为文章的属性部分,以三横杠-开始,-结束.里面记录了文章的标 ...