C#类型转换

  一、由于C#是强类型语言,变量在声明后不能重新声明为其它类型,但可以通过类型转换(Type Conversion)将符合转换条件的其它类型的变量转换为目标类型的变量,有以下几种类型的转换方式:

  二.隐式转换(Implicit Conversion):该转换是一种安全的类型转换,不会导致数据丢失,因此不需要任何显式操作;从较低精度/较小范围类型到较高精度/较大范围类型的转换以及从派生类到基类和所实现接口的转换都是隐式转换;

  1.隐式转换在代码中不需要任何显式操作,对于值类型:

double myDouble = 1f; //1

  ※所有数值类型之间的隐式转换关系详见;

  2.对于引用类型,一种类型的变量或对象可以直接隐式转换为任何一个直接或间接基类和所实现接口类型的变量:

public class MyBaseClass { }
public interface IMyInterface { }
public class MyClass : MyBaseClass, IMyInterface { }
MyClass myClass = new MyClass();
MyBaseClass myBaseClass = myClass; //派生类变量隐式转换为基类变量
IMyInterface myInterface = new MyClass(); //实现接口的类型对象隐式转换为接口变量

  三、显式转换(Explicit Conversion):也称为强制转换(Cast),在转换过程中如果可能存在数据丢失或出于某些原因可能抛出异常时必须使用显式转换,显式转换需要使用强制转换运算符();从较高精度/较大范围类型到较低精度/较小范围类型的转换以及从基类和所实现接口到派生类的转换都是显式转换;

  1.显式转换需要在要转换的值或变量前加入强制转换运算符()并在括号中指定目标类型,对于值类型:

int myInt = (int)2.5f; //2

  ※将浮点类型的值转换为整型类型时会损失一部分精度,只保留整数部分;

  ※所有数值类型之间的显式转换关系详见;

  2.对于引用类型,基类和接口类型的变量需要强制转换后才能赋值给另一种类型的变量:

myClass = (MyClass)myBaseClass; //基类变量显式转换为派生类变量
myClass = (MyClass)myInterface; //接口变量显式转换为实现接口的类型变量

  ※这个操作需要被转换变量所指向的对象是由目标类型或目标类型的派生类型的对象转换而来,否则会抛出异常InvalidCastException;推荐使用as运算符进行引用类型的显式转换,详见;

  3.引用类型之间的隐式转换和显式转换都不会改变变量的运行时类型,即获取转换前后两个变量的类型对象相同:

myClass.GetType(); //typeof(MyClass)
myBaseClass.GetType(); //typeof(MyClass)

  ※在调用不同编译时类型的变量的成员时会产生不同的行为;

  四、通过在类型定义中声明一些包含特殊签名的静态方法可以实现当前类型与其它类型之间的自定义转换规则,可以使不具有默认转换规则的类型之间进行隐式或显式转换,详见;

  ※自定义类型转换的实现方式如果产生新对象,则不再满足引用类型变量转换前后获取的类型对象相同的规则;

  五、内置类型中声明的和类型转换帮助类中封装好的转换方法:内置值类型中的静态方法Parase()、TryParase()等和类型转换帮助类System.Convert、System.BitConverter等:

  1.使用内置值类型的静态方法Parse()将string类型的对象转换为值类型的对象:

int num = int.Parse("25"); //参数为null时会抛出异常ArgumentNullException,参数格式不正确导致无法转换时会抛出异常FormatException

  2.推荐使用内置值类型的静态方法TryParse()进行转换,该方法不会抛出异常,如果转换失败则返回false,如果转换成功则返回true并输出转换后的值:

bool isCanConvert = int.TryParse("hello", out int num); //num = 0,isCanConvert = false
isCanConvert = int.TryParse("25", out num); //num = 25,isCanConvert = true

  3.使用基本类型转换帮助类System.Convert中的静态方法ToXXX()可以将任何一个基本类型转换为另一个基本类型:

int num = Convert.ToInt32("25"); //参数为null时会返回0,参数的值超过目标类型范围时会抛出异常OverflowException,参数格式不正确导致无法转换时会抛出异常FormatException

  ※通过此方式将浮点数转换为整型时会对小数部分进行四舍六入五取偶,损失一部分精度:

int num = Convert.ToInt32(5.5f); //6

 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2019-08-31 18:39 Minotauros 阅读(...) 评论(...) 编辑 收藏