C#的关键字Explicit 和 Implicit
一、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的更多相关文章
- operator、explicit与implicit
说这个之前先说下什么叫隐式转换和显示转换 1.所谓隐式转换,就是系统默认的转换,其本质是小存储容量数据类型自动转换为大存储容量数据类型. 例如:float f = 1.0: double d=f:这样 ...
- C#中转换运算符explicit、implicit、operator、volatile研究
C#中的这个几个关键字:explicit.implicit与operator,估计好多人的用不上,什么情况,这是什么?字面解释:explicit:清楚明白的;易于理解的;(说话)清晰的,明确的;直言的 ...
- 关键字explicit的作用(转)
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...
- C++关键字 explicit
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生.声明为explicit的构造函数不能在隐式转换中使用. C++中, 一个参数的构造函数(或者除了第一个参数 ...
- C++ 关键字 explicit, export, mutable
转自 explicit 如果A类有某个构造函数的单个输入参数,是B类(包括基本数据类型)的对象或引用,则C++的编译器会在需要A类形参的函数调用中,自动调用该构造函数,将B类实参隐式地转换为A类实参. ...
- 关键字explicit
今天在<C++ Standard Library>中看到 explicit 的作用,在这里做一下笔记,以备下次再次忘记该关键字的作用. By using the keyword expli ...
- Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚
最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前 ...
- C# 显式转换关键字 explicit
不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...
- c/c++拷贝构造函数和关键字explicit
c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...
随机推荐
- AngularJS中格式化日期为指定格式字符串
var date = $filter('date')(new Date(),'MM/dd/yyyy');
- 3DMAX安装未完成,某些产品无法安装的解决方法
3DMAX提示安装未完成,某些产品无法安装该怎样解决呢?,一些朋友在win7或者win10系统下安装3DMAX失败提示3DMAX安装未完成,某些产品无法安装,也有时候想重新安装3DMAX的时候会出现本 ...
- [SDOI2006] 线性方程组
洛谷 P2455 传送门 刚开始写了个消成上三角的,结果狂wa. 后来经过研究发现,消成上三角那种不能直接判断无解或无穷多解,需要其它的操作. 所以干脆学了个消成对角线的,写了一发A了. 其实两种消元 ...
- 忘记mysql密码后重置密码
https://jingyan.baidu.com/album/c275f6ba479ca9e33d7567ee.html?picindex=4 找不到mysql的my.ini文件问题: https: ...
- SpringBoot:三十五道SpringBoot面试题及答案
SpringBoot面试前言今天博主将为大家分享三十五道SpringBoot面试题及答案,不喜勿喷,如有异议欢迎讨论! Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一 ...
- c++ 如何清除上一次的输出?
#include <iostream.h>#include <stdlib.h>int main(){cout<<"PBY PBY PBY PBY PBY ...
- Windows Server 2008 配置 PHP 环境
在配置PHP环境之前要先配置好IIS. 传送门-> Win2008 Server下配置安装IIS 如果IIS是以默认的配置安装,则还需要安装CGI. 在这里勾选CGI,然后安装. 创建一个网站 ...
- python pip配置以及安装工具包的一些方法
pip是python的一个工具包管理工具,可以下载安装需要的工具包,想要使用它来管理工具包首先要安装pip,安装方法可以参照下面这个网址来进行: https://www.cnblogs.com/Nan ...
- Gre 隧道与 Keepalived
这一篇文章是做了不少功课的. 什么是 Gre 隧道 什么是 Vrrp KeepAlived 是什么 用Keepalived 怎么玩 附录 什么是 Gre 隧道 GRE 隧道是一种 IP-2-IP 的隧 ...
- OSX安装Mysql8.0
OSX下MySQL的安装非常方便,可以通过官网的dmg包进行安装,也可通过brew进行安装.以下介绍如何通过brew如何安装MySQL. 0X00.安装前的准备 既然要通过brew安装,那么就需要确保 ...