1. 强制转换
如(int)table1.rows["id"][0]; 这种转换在编程中不建议使用,是一种装箱拆箱的过程,就是说被转换类型本身必须是将要转换成的那种类型,否则必然出错;
如:
object objTest = new NewType();
NewType newValue = (NewType)objTest;
2. Convert
该类基本支持所以类型之间的转换。但也要求转换类型本身必须是将要转换成的那种类型,否则也会出错;
如:
Convert.toInt32(table1.rows["id"][0]);
3. DataType.Parse()
Note:上述3种方法是不安全的,需要用try-catch语句来进行保护。
4. DataType.TryParse()
如果转换不成功,会直接给目标变量赋初值。如:
decimal p1;
decimal.TryParse("{}", out p1);
5. As
如:
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;
}
6.(int)、int.Parse()、int.TryParse()、Convert.ToInt32()比较
(int)是一种类型转换;当我们从int类型到long、float、double、decimal类型,可以使用隐式转换,但是当我们从long类型到int类型就需要使用显式转换,否则会产生编译错误。
int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。int.Parse 只能转换数字类型的字符串。如果字符串为空,则抛出ArgumentNullException异常;如果字符串内容不是数字,则抛出FormatException异常;如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常;
int.TryParse与int.Parse又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为0。
Convert.ToInt32()是一种类容转换;但它不限于将字符串转为int类型,还可以是其它类型的参数;
比较:
Convert.ToInt32 参数为 null 时,返回 0;
int.Parse 参数为 null 时,抛出异常;
Convert.ToInt32 参数为 "" 时,抛出异常;
int.Parse 参数为 "" 时,抛出异常;
Convert.ToInt32 可以转换的类型较多。
7. ToString()、Convert.ToString()、(string)、as比较
ToString()、Convert.ToString()由别的对象得到 string 对象,它们间的区别只表现在要转换的对象为null时,如果obj为null,调用obj.ToString方法会导致 NullReferenceException异常,调用Convert.ToString不会抛出异常而返回一个null。
用强制转换 (string)obj要求obj的运行时类型必须是string。如果不是,就会抛出异常。
用as方法则会相对平稳,当obj的运行时类型不是string时会返回null而不抛出异常。
所以在通常在我们需要得到某个对象的string表达形式时,我们应该使用ToString和Convert.ToString,这时候你就得根据情形选一个,假如你能保证你的对象不为null,则两个差不多。如果有可能为null,你就应该用Convert.ToString,如果你希望它为null 的时候抛出异常,那么当然可以选择ToString。
这里是说object到string,如果在其它类型上调用第一种ToString(),得到的不一定是实际的内容,可能是对该类的描述,这取决于该类如何实现ToString()方法。