改善C#程序的157个建议(连载3)

发表于:2011-10-14 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  为了编写更健壮的DoWithSomeType方法,应该按如下方式改造它:

  1. static void DoWithSomeType(object obj)  
  2. {  
  3.     SecondType secondType = obj as SecondType;  
  4.     if (secondType != null)  
  5.     {  
  6.         //  省略  
  7.     }  
  8. }

  as操作符永远不会抛出异常,如果类型不匹配(被转换对象的运行时类型既不是所转换的目标类型,也不是其派生类型),或者转型的源对象为null,那么转型之后的值也为null。改造前的DoWithSomeType方法会因为引发异常带来效率问题,而使用as后,就可以完美地避免这种问题。

  现在,再来看第二种情况,即FirstType是SecondType的基类。在这种情况下,既可以使用强制转型,也可以使用as操作符,代码如下所示:

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         SecondType secondType = new SecondType() { Name = "Second Type" };  
  6.         FirstType firstType1 = (FirstType)secondType;  
  7.         FirstType firstType2 = secondType as FirstType;  
  8.     }  
  9. }  
  10. class FirstType  
  11. {  
  12.     public string Name { get; set; }  
  13. }  
  14. class SecondType : FirstType  
  15. {  
  16. }

  但是,即使可以使用强制转型,从效率的角度来看,也建议大家使用as操作符。

  知道了强制转型和as之间的区别,我们再来看一下is操作符。DoWithSomeType的另一个版本,可以这样来实现,代码如下所示:

  1. static void DoWithSomeType(object obj)  
  2. {  
  3.     if (obj is SecondType)  
  4.     {  
  5.         SecondType secondType = obj as SecondType;  
  6.         //省略  
  7.     }  
  8. }

  这个版本显然没有上一个版本的效率高,因为当前这个版本进行了两次类型检测。但是,as操作符有一个问题,即它不能操作基元类型。如果涉及基元类型的算法,就需要通过is转型前的类型来进行判断,以避免转型失败。

相关链接:

改善C#程序的157个建议(连载1)

改善C#程序的157个建议(连载2)

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号