我的鸡肋条之二: 也说C#的cast

  在读代码的时候有机会经常看到这样的书写方式。
 
ClassA cc  =  (ClassA)( new  ClassB());
 
  如果是用惯C++的用户可能马上就会把心脏提到嗓子眼儿,这样的代码不会有危险吗?能确认这样的强制转换不会出现问题吗?
  让我们做一下测试就会发现,在C#中
    ClassA与ClassB没有任何继承关系的话,
       编译时能为我们抛出CS0030错误,编译都过不了的问题自然不用担心。
    ClassA与ClassB有继承关系的话,
       如果ClassA是父类那么一切正常,不会出现问题。
       如果ClassA是子类,当执行这条语句时会被抛出System.InvalidCastException异常。
 
  OK,C#真够健壮,毫无问题!
 
  于是应该可以得到这样的结论,C#语言的cast与C语言中的不同,从动作式样来看,它的内部实现了类似C++中的dynamic_cast。可以放宽心使用。
 
  在这个基础之上让我再延伸的讨论一下C#的cast。
 
  在调试程序的时候发生了System.InvalidCastException异常,发生异常的地方刚刚好是用cast的地方。
 
  这个时候有两种解决办法:
   一种是程序的错误。
   一种是没有做异常处理。
 
   如果是程序的错误,那么检测程序-->修改Bug-->重新测试-->...这个比较直接。
 
   可是在不得不处理这个异常的时候就有些让人不爽了,不的不处理这个异常代表这样一个客观事实。
   只有在程序跑起来的时候才能确定cast一个什么东西...
 
  解决办法:
 
   我在做些个人的小程序中曾经不止一次的try catch过;   不好。
   后来有看了一遍C#的语言手册,学会了用is先判断后执行;还成,有点儿性能问题。
     先问是ClassA吗?那么让你cast。
   后来有再看了一遍C#的语言手册,学会了用as代入;   我是满意了。
     不是ClassA的话我就不执行。
 
--
  这不仅包袱太小,还抻的太长,写到最后的时候我脸红了。

转载于:https://www.cnblogs.com/Yu/archive/2004/09/15/43446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值