今天写代码的时候,突然遇到一个问题,即类型转换。C#提供的类型转换有强制转换和采用 as进行转换。

那问题就来了,在一个对象类型确定的情况下,对它进行类型转换是采用强制转换还是采用as进行转换。如以下情况:

Code

在确定hashtable值的类型为字符串的情况下,用那种方式效率会高一点?

我的第一反映是google一下,google了十几分钟,没有找到满意的答案。不过有一个说明是这样的,在类型转换时,as首先进行类型判断,如果转换成功返指定类型的结果,如过类型不兼容,则返回空。而强转不进行类型判断,转换失败后会抛出异常,所以在强制转换类型是需加入异常处理。代码如下:

 

try
            {
                
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

 

问题出来了,即as和强制转换的区别是两个关键的不同,isinst和castclass。除了关键字的不同,找不到其它的了,IL并没有告诉我答案,IL代码和C#代码没太大区别。在去google一下两个关键字的说明名解释。没有找到满意的答案。

 

希望园子里的高手能帮小弟回答这个问题,在类型确定的情况下,是采用as做类型转换还是强制转换。