C#类型转换
C#类型转换的可能情况
-
值类型间的传统强制类型转换,(type)变量名
-
使用as的安全类型转换
-
派生类转基类,隐式转换;基类转派生类,显式转换
-
值类型转引用类型,称为装箱;引用类型转值类型,称为拆箱
-
从低精度的数值类型到高精度的数值类型的转换,隐式数值转换
-
基本类型之间,使用Convert类实现类型转换
-
字符串类型转换成任意类型,使用Parse方法
(type)变量名
传统不安全的强制类型转换
Object obj1 = new NewType(); //第一种:不安全
NewType newValue = (NewType)obj1;
Object obj1 = new NewType(); //第二种:不高效
NewType newValue = null;
try
{
newValue = (NewType)obj1;
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
as+类型
安全高效的类型转换
Object obj1 = new NewType();
NewType newValue = obj1 as NewType;
当需要转化对象的类型属于转换目标类型,或者转换目标类型的派生类型时,才能成功,当不成功的时候,会返回null,所以使用前需判是否为null检查转换成功与否,直接使用将抛出异常
- 无法应用于值类型转换(因为值类型不能为null)
- 无法应用于自定义类型间转换
Is+类型
检查对象是否与给定的类型兼容
Object obj1 = 10;
if(obj1 is int )
{
int num = (int)obj1;
}
若对象引用是null,is运算符总是返回false,因为没有可检查其类型的对象。
- Object => 已知引用类型——使用as操作符完成
- Object => 已知值类型——先使用is操作符来进行判断,再用类型强转换方式进行转换
装箱与拆箱
装箱步骤
- 在托管堆中分配内存,除了分配值类型各个字段所需内存,还要加上托管堆所有对象都有的两个额外成员(类型对象指针和同步索引块)所需的内存
- 将值类型的字段复制到新分配的堆内存中
- 返回对象地址,即对象的引用
拆箱步骤
- 获取对象各个字段的地址
- 将各个字段的值从托管堆上复制到线程栈新的值类型实例
Convert
一般格式
convert.To数据类型(变量名);
常用的convert类型转换方法
方法 | 解释 |
---|---|
Convert.ToInt16() | 转换为整型(short) |
Convert.ToInt32() | 转换为整型(int) |
Convert.ToInt64() | 转换为整型(long) |
Convert.ToChar() | 转换为字符型(char) |
Convert.ToString() | 转换为字符串型(string) |
Convert.ToDateTime() | 转换为日期型(datetime) |
Convert.ToDouble() | 转换为双精度浮点型(double) |
Conert.ToSingle() | 转换为单精度浮点型(float) |
字符串与其他类型的转换
其他类型转为字符串,使用
变量名.ToString();
字符串转换为其他类型
数据类型.Parse(字符串类型的值);
note:
当多于一个字符的字符串用Parse转换为char类型时,会抛出异常
当不是数字的字符串用Parse转换为int类型时,会抛出异常
示范
//ToString
int i = 10;
string str = i.ToString();
Console.Write(str);
//输出:10
//Parse
char i = char.Parse("h");
Console.Write(i);
//输出:h
int i = int.Parse("21");
Console.Write(i);
//输出:21