服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中的Explicit和Implicit详情

C#中的Explicit和Implicit详情

2022-12-05 12:21LamondLu C#

Implicit提高了代码的可读性,但程序员需要自己保证转换不引发异常且不丢失信息、Explicit可阻止编译器静默调用可能产生意外后果的转换操作。前者更易于使用,后者能向阅读代码的每个人清楚地指示您要转换类型,下面就和小编

先上一段奇怪的代码:

?
1
2
3
4
5
if (dto.Payment == null) continue;
 
var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID);
 
dto.Payment = entity?.Payment;


其中dto.Payment是一个PaymentDTO类的实例,entity?.Payment是一个Payment类的实例,PaymentDTO类和Payment类没有子父关系,所以不存在子类和父类之间的隐式转换。

奇怪的是Visual Studio的编译器没有提示任何编译错误。

打开PaymentDTO类的定义之后,发现了以下方法签名。

?
1
2
public static implicit operator PaymentDTO(Payment payment)

从方法签名上看,这就是重写PaymentDTO类型的操作符,但并不是我以前常用的+,-,*,/, ==等。

查询MSDN之后,才了解到implicit和explicit是一对转换操作符。

 一、Implicit和Explicit

1、Implicit

Implicit关键字用于声明隐式的用户定义类型转换运算符。它可以实现2个不同类的隐式转换 ,提高代码的可读性。但是需要注意使用隐式转换操作符之后,在编译时会跳过异常检查,所以隐式转换运算符应当从不引发异常并且从不丢失信息,否则在运行时会出现一些意想不到的问题。

例如当前PaymentDTO和Payment的定义如下

?
1
2
3
4
5
6
7
8
9
10
11
public class Payment
{
     public decimal Amount { get; set; }
 
}
public class PaymentDTO
 
{
     public string AmountString { get; set; }
}

如果需要将Payment隐式转换成PaymentDTO, 仅需声明PaymentDTO的隐式转换运算符

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PaymentDTO
{
    public string AmountString { get; set; }
 
   public static implicit operator PaymentDTO(Payment payment)
 
    {
        return new PaymentDTO
 
        {
            AmountString = payment.Amount.ToString("C2")
        };
 
    }
}

调用时只需要直接赋值就可以

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Program
   {
       static void Main(string[] args)
       {
           PaymentDTO dto = new Payment { Amount = 1 };
 
 
 
           Console.WriteLine(dto.AmountString);
 
           Console.Read();
 
       }
   }

2、、Explicit

Explicit关键字声明必须通过转换来调用的用户定义的类型转换运算符。不同于隐式转换,显式转换运算符必须通过转换的方式来调用,如果缺少了显式的转换,在编译时就会产生错误。

例如现在我们将前面PaymentDTO类中定义的转换操作符从Implicit变为Explicit

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PaymentDTO
 
{
 
    public string AmountString { get; set; }
    public static explicit operator PaymentDTO(Payment payment)
 
    {
 
       return new PaymentDTO
 
        {
            AmountString = payment.Amount.ToString("C2")
 
        };
    }
}

这时候由于Main方法中没有显式转换,所以编译器出错,提示Cannot implicitly convert type 'ExplicitImplicit.Payment' to 'ExplicitImplicit.PaymentDTO'. An explicit conversion exists (are you missing a cast?)

 C#中的Explicit和Implicit详情

如果想要编译器通过编译, 只需要做一个显示转换即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class Program
 
{
    static void Main(string[] args)
    {
        PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 };
 
        Console.WriteLine(dto.AmountString);
 
       Console.Read();
 
    }
}

到此这篇关于C#中的ExplicitImplicit详情的文章就介绍到这了,更多相关C#中的ExplicitImplicit内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/lwqlun/p/8082405.html

延伸 · 阅读

精彩推荐
  • C#C#程序执行时间长查询速度慢解决方案

    C#程序执行时间长查询速度慢解决方案

    这篇文章主要介绍了C#程序执行时间长查询速度慢解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    叶丶梓轩3762022-09-24
  • C#C#调用带结构体指针Dll的方法

    C#调用带结构体指针Dll的方法

    在C#到底该如何安全的调用这样的DLL接口函数呢?本文将详细介绍如何调用各种参数的方法,对C#结构体指针DLL相关知识感兴趣的朋友一起看看吧...

    ye_ming5602022-11-28
  • C#WPF 自定义雷达图开发实例教程

    WPF 自定义雷达图开发实例教程

    这篇文章主要介绍了WPF 自定义雷达图开发实例教程,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下...

    WinterFish11562021-12-06
  • C#C# 实现TXT文档转Table的示例代码

    C# 实现TXT文档转Table的示例代码

    这篇文章主要介绍了C# 实现TXT文档转Table的示例代码,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...

    農碼一生6992022-10-21
  • C#C# WinFrom导出Excel过程解析

    C# WinFrom导出Excel过程解析

    这篇文章主要介绍了C#WinFrom导出Excel过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...

    最爱吃汤圆2710402022-08-08
  • C#C#找出字符串中第一个字母并大写的方法

    C#找出字符串中第一个字母并大写的方法

    这篇文章主要介绍了C#找出字符串中第一个字母并大写的方法,通过C#面向对象的方式定义了类的成员函数实现字符串转换的功能,需要的朋友可以参考下...

    礼拜一4142021-11-11
  • C#Unity幸运转盘实战项目

    Unity幸运转盘实战项目

    这篇文章主要为大家详细介绍了Unity幸运转盘实战项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    CC_childe6382022-07-20
  • C#C#比较时间大小的方法总结

    C#比较时间大小的方法总结

    在本篇内容里小编给大家分享的是关于C#比较时间大小的方法总结,对此有需要的朋友们可以学习下。...

    C#教程网5742022-03-07