显式和隐式类型转换及其区别
介绍
编程语言主要有两种类型。第一种是静态类型的,第二种是动态类型的。动态类型有时也称为鸭子类型。有一个著名的故事动词来描述它。
如果它看起来像鸭子,游起来像鸭子,叫起来也像鸭子,那么它很可能就是鸭子。
我们将了解 C# 提供的有关静态类型的功能。在 C# 中,声明变量后,除非该类型可以隐式转换为给定的变量类型,否则不能再次声明该变量或为其分配其他类型的值。这是在编译时决定的,并对开发人员如何使用/声明变量构成限制。尽管执行速度也会有所降低,但静态类型语言通常比动态类型语言更快。两者各有优缺点。
我们举一个简单的例子。
int j;
j = "Hello C# World";
这将导致错误,因为int和string不能隐式转换。
有时候,你需要将一个变量的值复制到另一个变量,例如将一个整数传递给采用 double 或 long 参数的方法。或者,你可能还需要在类之间推送变量。
C# 提供了四种将一种类型转换为另一种类型的方法:
- 隐式转换
- 显式转换
- 用户定义转换
- 使用辅助类进行转换
类型转换也称为强制类型转换或类型强制转换。
隐式转换
这种类型的转换没有特殊语法,这是最安全的转换类型。例如,从较小的整数类型转换为较大的整数类型或从派生类转换为基类时,不会丢失任何数据。
有一个隐式数字转换表,当您想弄清楚哪些类型是相互兼容的时,它会派上用场。
下面是数字数据类型隐式转换的示例。
int number = 128;
double bigger = number;
当您使用双精度类型时,您需要注意在应用任何格式之前它将被四舍五入为 15 位有效数字。
下面是类到基类的隐式转换的一个例子。
DerivedClass d = new DerivedClass()
BaseClass b = d
有许多转换子类型都被视为隐式的。
- 身份转换
- 隐式数值转换
- 隐式枚举转换
- 隐式可空转换
- Null 文本转换
- 隐式引用转换
- 装箱转换
- 隐式动态转换
- 隐式常量表达式转换
- 用户定义的隐式转换
- 匿名函数转换
- 方法组转换
显式转换
这种类型的转换还涉及转换运算符。该过程通常与信息丢失或类型转换失败有关。通常,当我们从较大精度的数据类型转换为较低精度时,会提到数字转换。有时甚至从基类转换为派生类也会在这里提到。
有一个明确的数字转换表,当您想弄清楚哪些类型兼容时它会派上用场。
下面是显式转换的一个例子。
double mypi = 3.14;
int a;
a = (int)mypi;
注意强制类型转换运算符(int)。此转换意味着结果将删除所有数字,结果为3。
还可以将基类转换为派生类。
Opel o = new Opel();
Car c = o;
Opel oo = (Opel)c;
转化增强
C# 允许您扩充预定义的隐式和显式转换,这些称为用户定义转换。它们可以通过在类和结构类型中声明转换运算符来引入。对于什么是用户定义转换有严格的限制。您不能重新定义任何现有的隐式或显式转换。
在此站点上,您可以阅读有关如何定义自己的转换的更多详细信息。
这些用户定义的转换将值从其类型(称为源类型)转换为另一种类型(称为目标类型 ) 。 通过为特定的源类型和目标类型找到最具体的用户定义转换运算符来完成评估。
一般步骤:
- 查找将从中考虑此转换运算符的类或结构集。
- 格式化类型集并确定哪些运算符可用。
- 从适用的运算符集合中,确定哪一个最具体且无歧义。
- 如果有必要,执行标准转换。
- 调用用户定义的转换。
- 如果有必要的话,最后进行标准转换。
结论
类型转换偶尔会进入每个开发人员的生活。这是一个非常容易理解的概念。您需要注意一些规则,除此之外,经验来自实践。清晰的转换有助于应用程序更易于出错,更易于维护。它们还减少了调试语法正确的程序以寻找语义错误所花费的时间。总而言之,我希望这篇文章值得一读,并能为您提供所需的见解!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~