今天写代码的时候,突然遇到一个问题,即类型转换。C#提供的类型转换有强制转换和采用 as进行转换。
那问题就来了,在一个对象类型确定的情况下,对它进行类型转换是采用强制转换还是采用as进行转换。如以下情况:
Code
在确定hashtable值的类型为字符串的情况下,用那种方式效率会高一点?
我的第一反映是google一下,google了十几分钟,没有找到满意的答案。不过有一个说明是这样的,在类型转换时,as首先进行类型判断,如果转换成功返指定类型的结果,如过类型不兼容,则返回空。而强转不进行类型判断,转换失败后会抛出异常,所以在强制转换类型是需加入异常处理。代码如下:
try
{
string result2 = (string)table[1];
}
catch (Exception e)
{
throw e;
}
{
string result2 = (string)table[1];
}
catch (Exception e)
{
throw e;
}
这样看来还是采用as好,但是在类型确定的情况下,即table的值只会是字符串,不会是其它类型或空的情况下,在强转时就不用加异常判断。那么用as还是强制转换呢?问题没有解决,我想到看看as和强转的IL代码,看是否能找到相关线索。以上代码的IL代码我就不贴出来了,就把关键的代码贴出来。如下:
IL_0025: isinst [mscorlib]System.String
IL_002a: stloc.1
IL_0037: castclass [mscorlib]System.String
IL_003c: stloc.2
IL_002a: stloc.1
IL_0037: castclass [mscorlib]System.String
IL_003c: stloc.2
问题出来了,即as和强制转换的区别是两个关键的不同,isinst和castclass。除了关键字的不同,找不到其它的了,IL并没有告诉我答案,IL代码和C#代码没太大区别。在去google一下两个关键字的说明名解释。没有找到满意的答案。
希望园子里的高手能帮小弟回答这个问题,在类型确定的情况下,是采用as做类型转换还是强制转换。