一、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

最新文章

  1. python获取ip代理列表爬虫
  2. python简单搭建HTTP Web服务器
  3. 前端性能优化--为什么DOM操作慢?
  4. RAF(RandomAccessFile)类
  5. [游戏模版21] Win32 物理引擎 能量守恒
  6. 【BZOJ】【3524】【POI2014】Couriers
  7. DateTime.ToString(&quot;dd/MM/yyyy&quot;);后,不能直接Convert.ToDateTime的解决:
  8. Gradle之恋-命令行详解
  9. MOF编译器无法连接VMI服务器。原因可能是语义错误的解决方案
  10. 【模版】AC自动机(简单版)
  11. Ubuntu 下安装 matlab2018a
  12. 45.work_struct和delayed_work的工作队列使用
  13. 使用阿里云OSS,上传图片时报错:java.lang.ClassNotFoundException:org.apache.http.ssl.TrustStrategy
  14. HTML5 background-color和background-image问题共用问题
  15. python 常用库及安装使用
  16. sql查询 !=&#39;&#39; 和 is not null的区别
  17. Mac下使用Fiddler(转载园友小坦克)
  18. webpack打包遇到过的问题
  19. xml DTD中的ELEMENT和ATTLIST
  20. 第1章 1.10计算机网络概述--OSI参考模型和TCP_IP协议

热门文章

  1. OpenCV 离散傅立叶变换
  2. baidumap 百度地图,实现多点之间的带方向路线图。
  3. shell制作bin文件
  4. ISBN|方正|超星|The national academies press|OECD|RSC|Springer Link|Knovel|Encyclopedia Britannica
  5. 使用 Commitizen 撰写 Angular 规范的 commit message
  6. 添砖加瓦:snappy无损压缩算法
  7. Rong's Portfolio
  8. JQuery之选择器篇(一)
  9. Html学习笔记(二) 简单标签
  10. HTML 和 CSS 基础