WYB
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 18 文章- 1 评论- 59
关于C#的类型转换
前段时间宁波社区讨论了类型转换是用as关键字好还是用()好的问题,当时我轻易地相信了一片转载的文章的观点(
http://hi.baidu.com/salangane0512/blog/item/24a7448b49011d17c8fc7aa9.html
),认为用as比用()好。今天偶尔试验了一下,其实事情不是那样的,我当时的不严谨导致犯了一个小小的经验主义错误。
看下面的代码:
//
类型定义
public
interface
I
{
string
Name {
get
;
set
; }
}
public
class
A : I
{
public
string
Name {
get
;
set
; }
}
public
class
B : A
{
public
int
Key;
public
static
explicit
operator
string
(B operand)
{
return
operand.Name;
}
}
//
方法调用
private
void
button1_Click(
object
sender, EventArgs e)
{
B b
=
new
B();
A a1, a2;
a1
=
(A)b;
a2
=
b
as
A;
string
h
=
(
string
)b;
}
对应调用方法的IL代码:
.method
private
hidebysig instance
void
button1_Click(
object
sender,
class
[mscorlib]System.EventArgs e) cil managed
{
.maxstack
1
.locals init (
[
0
]
class
WindowsFormsApplication15.B b,
[
1
]
class
WindowsFormsApplication15.A a1,
[
2
]
class
WindowsFormsApplication15.A a2,
[
3
]
string
h)
L_0000: nop
L_0001: newobj instance
void
WindowsFormsApplication15.B::.ctor()
L_0006: stloc.
0
L_0007: ldloc.
0
L_0008: stloc.
1
L_0009: ldloc.
0
L_000a: stloc.
2
L_000b: ldloc.
0
L_000c: call
string
WindowsFormsApplication15.B::op_Explicit(
class
WindowsFormsApplication15.B)
L_0011: stloc.
3
L_0012: ret
}
这下很清楚了,()和as在做类型转换的时候都是一样处理的,根本不存在所谓那个性能好那个性能坏的问题,完全是受个人习惯影响的。
使用as唯一的好处是可以分清你是在做基于基类和接口的类型转换还是使用操作符重载机制(CLR编译器层处理)的类型转换(后一种本质上就是调用一种方法!!)。比如例子中的:
string
h
= (
string
)
b
; 。这是使用as替代()操作符的唯一好处,而不是那篇文章中长篇大论讲的那样。
判断类型用is,转换的话最好用as,只是因为这样清楚一些。
大家在工作交流中经常会犯一些不严谨的错误,我在此先作自我批评,希望大家平时多加注意和改正。
posted @ 2008-07-05 12:12
王弈博
阅读(194)
评论(4)
编辑
收藏
所属分类:
.NET框架与语言
发表评论
回复
引用
#1楼
2008-07-05 18:28 |
James_cn [未注册用户]
as 比 () 好的原因是在转换错误的时候不会引发异常,
异常很占用资源,所以在.net 2.0中也提供了TryParse这样的方法
回复
引用
查看
#2楼
[
楼主
]2008-07-05 18:56 |
王弈博
--引用--------------------------------------------------
James_cn: as 比 () 好的原因是在转换错误的时候不会引发异常,
异常很占用资源,所以在.net 2.0中也提供了TryParse这样的方法
--------------------------------------------------------
恩,其实是这样的,类型转换实际上分两种:第一种就是做基于基类和接口的类型转换,也就是继承类之间的转化,这种情况无论是用as还是(),CLR编译器是会作检查的,要么就通不过编译要么就一定不会出错,而且编译出的IL代码是一模一样的。
第二种情况就像我上面例子写的那个显式转换的例子,那其实是一个方法调用,写成()的坏处在于你总会误认为它是像第一种情况那样的类型转换,自然会在运算时抛出异常的。你说的会抛出异常的情况一定是这种情况。
你可以详细的试一下。
所以严谨一点的话,写成as好,因为一看就确认是在做继承类(接口)之间的转换,写成()的话,就有点不清楚了,仅此而已。
回复
引用
查看
#3楼
[
楼主
]2008-07-05 19:05 |
王弈博
谢谢James_cn 的评论,太冷清了,呵呵
回复
引用
查看
#4楼
2008-07-09 08:37 |
鹰击长空
使用as是一种防御性编程,可以通过a2 = b as A;if(a2!=null){}避免异常
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-07-05 12:16 编辑过
相关文章:
关于IE问题,请教和求救
在JavaScript中也玩变量类型强行转换
相关链接:
所属分类的其他文章:
C#4.0,支持动态语言?
强烈推荐一篇C# 3.0的好文
关于C#的类型转换
万分疑惑volatile这个关键字
谈谈中间代码
最新IT新闻:
Google向Wine贡献更多代码
苹果创始人Steve Wozniak称iPod将被淘汰
福布斯:硅谷日子将更难过 谁下一个倒下
微软老矣 尚能赚否?
YouTube探索新赢利模式 开始售音乐、视频游戏
<
2008年7月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
宁波.net俱乐部
我参与的团队
宁波.NET俱乐部(0/63)
随笔分类
.NET框架与语言(5)
(rss)
LINQ(2)
(rss)
WCF(2)
(rss)
WF(1)
(rss)
WPF&Silverlight(1)
(rss)
加密&伪随机(1)
(rss)
其他(2)
(rss)
人工神经网络算法
(rss)
软件工程与设计(2)
(rss)
物理
(rss)
项目
(rss)
杂谈(1)
(rss)
随笔档案
2008年7月 (10)
2008年6月 (8)
积分与排名
积分 - 7018
排名 - 4277
最新评论
阅读排行榜
1. 工作流权限管理方法论(2165)
2. 什么时候用LINQ?(275)
3. Silverlight, B/S or C/S?(228)
4. 发现了学XML最好的素材(217)
5. C#4.0,支持动态语言?(209)
评论排行榜
1. 工作流权限管理方法论(22)
2. Silverlight, B/S or C/S?(7)
3. 火了,机器总死机(6)
4. WCF中同步和异步通讯总结(4)
5. 关于C#的类型转换(4)