.net下面的as与“cast”

在.net下面,我们做类型的强制转换有两种方式,比如把对象o转换成A类型的对象:

1。 A a = (A)o;
2。 A a = o as A;

那么这两种方式有什么区别呢?或者说有区分它们的必要么?看了我下面的分析,大家自然就明白了。

实际上,对这个问题不能一概而论,需要考虑这样几种情况。

第一种情况:o是A的子类。
在这种情况下,无论是用方法1还是方法2,效果都是一样的!通过查看上面两种方法的IL代码,会发现它们的IL代码是完全一样的,都是简单的把o出栈,然后保存到a的位置。

因此,当o是A的子类的时候,两种方式没有区别。

现在考虑第二种情况:o不是A的子类。
举个例子,假如o就是object类型吧。
查看两者的IL代码,会发现在第1种方法里面,在把o出栈之后,做了一个castclass操作,它尝试把o转换成A类型。如果成功,当然没的说了。如果失败了,它会丢出一个Invalid cast异常。

在第2种方法里面,在把o出栈之后,做了一个isinst操作,它检测是否可以把o转换成A类型。如果失败了,后面的入栈操作会压入一个null进去,也就是说,你的a变成了null。

好了,现在已经很明了了。可是,区分它们有什么意义呢?

首先,在第一种情况下,我们当然不需要去区分它们了,随便你怎么都可以。因为它们根本就没有区别!

但是在第二种情况下就有区别了。如果用第1种方法,就要考虑处理异常;如果用第2种方法,就必须得在使用a之前做一下非空检测,否则很有可能出现“没有实例化”的异常。但是,实际上,用第1种方法,也要进行非空检测。这是为什么呢?因为假如o是null的话,也是可以成功进行类型转换的。这样看来,无论用那种方法,进行非空检测都是不能省的(当然如果你愿意省掉我也没说的),不过第1种方法还要多个异常处理才算完善。如此看来,使用第1种方法多少费点劲哦。

那么,现在结论出来了——如果可以的话,尽量用as吧!再结合is关键字,在最后给出一个完善的类型转换方案:
A a = o as A;
if (a is A)
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在数据库查询中,cast as date是将字符串类型转换为日期类型的一种方法。这种方法可以将一个字符串表示的日期转换为数据库中的日期数据类型。在引用中的示例中,使用了cast('25-1月 -19' as date)将字符串'25-1月 -19'转换为日期类型。同样地,在引用中的示例中,使用了cast(sysdate as varchar2(100))将日期类型转换为字符串类型。 在引用中的示例中,使用了cast(? as DATE)将时间戳转换为日期类型。这段代码中的?表示时间戳的参数,通过cast函数将其转换为日期类型以进行数据库查询。这种方法可以用于比较日期范围,例如查询某个范围内的数据。 总结起来,cast as date是一种将字符串或时间戳转换为日期类型的方法,可以在数据库查询中使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [oracle的函数cast进行类型转换用法](https://blog.csdn.net/gc1329689056/article/details/91879628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [TiDB查询date类型数据时无结果,使用cast(? as DATE)解决](https://blog.csdn.net/chushoufengli/article/details/108642663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值