C#类型转换 (非原创)
2008-12-09 15:28
393 查看
1. 强制转换
E.g.:
(int)table1.rows["id"][0];这种转换在编程中不建议使用,是一种装箱拆箱的过程,就是说被转换类型本身必须是将要转换成的那种类型,否则必然出错;
E.g.:
object objTest = new NewType();
NewType newValue = (NewType)objTest;
2. Convert
该类基本支持所以类型之间的转换。但也要求转换类型本身必须是将要转换成的那种类型,否则也会出错;
E.g.:
Convert.toInt32(table1.rows["id"][0]);
3. DataType.Parse()
Note:上述3种方法是不安全的,需要用try-catch语句来进行保护。
4. DataType.TryParse(),如果转换不成功,会直接给目标变量赋初值。
E.g.:
decimal p1;
decimal.TryParse("{}", out p1);
5. As
E.g.:
object objTest = new NewType();
NewType newValue = objTest as NewType;
对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。
要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
if( newValue!= null )
{
//Work with the object named "newValue"
}
Note:使用as操作符有如下几点限制。
(1)不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;
(2)不能应用在值类型数据,即不能如下写(也会出现编译错误)。
object objTest = 11;
int nValue = objTest as int;
对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。
NewTypeOne newTestOne = new NewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。
public class NewTypeOne
{
public static explicit operator NewTypeTwo( NewTypeOne objTest )
{
//Convert object into new type
}
}
对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。
object objTest = 11;
if( objTest is int )
{
int nValue = (int)objTest;
}
E.g.:
(int)table1.rows["id"][0];这种转换在编程中不建议使用,是一种装箱拆箱的过程,就是说被转换类型本身必须是将要转换成的那种类型,否则必然出错;
E.g.:
object objTest = new NewType();
NewType newValue = (NewType)objTest;
2. Convert
该类基本支持所以类型之间的转换。但也要求转换类型本身必须是将要转换成的那种类型,否则也会出错;
E.g.:
Convert.toInt32(table1.rows["id"][0]);
3. DataType.Parse()
Note:上述3种方法是不安全的,需要用try-catch语句来进行保护。
4. DataType.TryParse(),如果转换不成功,会直接给目标变量赋初值。
E.g.:
decimal p1;
decimal.TryParse("{}", out p1);
5. As
E.g.:
object objTest = new NewType();
NewType newValue = objTest as NewType;
对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。
要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:
if( newValue!= null )
{
//Work with the object named "newValue"
}
Note:使用as操作符有如下几点限制。
(1)不用在类型之间进行类型转化,即如下编写就会出现编译错误。
NewType newValue = new NewType();
NewType1 newValue = newValue as NewType1;
(2)不能应用在值类型数据,即不能如下写(也会出现编译错误)。
object objTest = 11;
int nValue = objTest as int;
对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。
NewTypeOne newTestOne = new NewTypeOne();
NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;
但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。
public class NewTypeOne
{
public static explicit operator NewTypeTwo( NewTypeOne objTest )
{
//Convert object into new type
}
}
对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。
object objTest = 11;
if( objTest is int )
{
int nValue = (int)objTest;
}
相关文章推荐
- C#类型转换 (非原创)
- C# 调用C++ DLL 的类型转换(转载版)
- C#中数据类型的安全转换(is,as)
- C# 把日期字符串转换为日期类型 (MM大写为月、小写为分钟)
- c++与c#的类型转换
- C#中的类型转换大总结
- C#控制台基础 可空类型与非可空类型 相互转换
- c#之类型转换
- C#调用非托管C编写DLL的数据类型转换
- C# 将一个对象转换为指定类型
- c#的as类型转换详细理解,欢迎园友拍砖。
- C#学习第三天 类型转换和随机数
- asp.net(c#)各数据类型的转换,和输出
- C#类型转换、is、as、单问号、双问号解密
- C#语言基础之转义字符、变量、常量、类型转换
- C#的数据类型转换
- DEMO[C#]TypeChange 关于类型转换的一个DEMO
- C#类型转换、is、as、单问号、双问号解密
- C#的隐式和显示类型转换
- 黑马程序员--.Net学习日记——C#中的类型转换