• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

设计中,关于 as 关键字强制转换的效率是不是需要考虑?

wt_sanlian 2008-12-02 03:14:29
现在me在做一个通讯系统,将信息封装了了Message类,各种消息类都从这个类中派生,

在消息处理程序中,大量的应用了is和as 关键字进行类型识别和类型转换,由于消息

处理需要实时性较高,使用这种方式不知道会不会有效率问题?

void MessageProc( TMessage theMessage)
{
...
if( theMessage is TLampMessage )
{
TLampMessage lMessage = theMessage as TLampMessage;
....

}
...
}



请高人赐教,谢谢

...全文
113 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zhnzzy 2008-12-03
影响不大。
回复
wt_sanlian 2008-12-03
4楼所说用Kind的方法,可能需要定义一个大的枚举变量,这样不利于程序扩展,当我需要引入新的消息类时,还需要重新定义枚举变量.

现在的软件1秒钟大概处理近百条消息,频繁的用as进行转换,我想知道as转换是不是一种很耗时的操作,大概在什么时间数量级?
回复
Sunferny 2008-12-03
同意楼上的。
回复
huwei001982 2008-12-03
我觉得楼主的做法是对的
先用 is 判断, 再用 as 转换

if (obj is TMessage)
{
TMessage t = obj as TMessage;
t.xxx();
}



TMessage t = obj as TMessage;
if (t != null)
{
t.xxx();
}

应该是前者的效率高, 而且思路更清晰
回复
soaringbird 2008-12-03
这些语法对性能的影响跟.Net本身对性能的影响比起来,忽略不计
回复
flyjimi 2008-12-02
[Quote=引用 1 楼 bloodish 的回复:]
if( theMessage is TLampMessage )
这个判断没有必要,as其实已经包含了is的判断,你只需要判断as返回的结果是不是null,在做其他操作即可.
TLampMessage lMessage = theMessage as TLampMessage
if(lMessage != null)
{
//to do
}
[/Quote]

对的,is和as没必要同时用。
回复
wangkuang5 2008-12-02
[Quote=引用 6 楼 bloodish 的回复:]
可以用as判断就应该避免用is,你可以看一下:.Net框架程序设计 这本书里对is,as的解释
这是个网址,你可以看一下相关资料
http://www.cnblogs.com/ziling8163/articles/891837.html

如4楼所说,你给个类型出来判断也是比较好的方式.
[/Quote]

有道理
回复
bloodish 2008-12-02
可以用as判断就应该避免用is,你可以看一下:.Net框架程序设计 这本书里对is,as的解释
这是个网址,你可以看一下相关资料
http://www.cnblogs.com/ziling8163/articles/891837.html

如4楼所说,你给个类型出来判断也是比较好的方式.
回复
chNeed1 2008-12-02
我觉得is 和 as 的区别就像Dictionary的
ContainKey 和 TryGetValue 一样
回复
slimfeng 2008-12-02
还有一种方式,直接给基类TMessage定义一个成员Kind,表明该消息种类。
循环时直接判断Kind
回复
cpio 2008-12-02
is应该很省时间,转换应该要费时间点

回复
wt_sanlian 2008-12-02
是这样的,这个函数可能处理很多类似消息, 所以才用了这个结构.
void MessageProc( TMessage theMessage)
{
...
if( theMessage is TLampMessage )
{
TLampMessage lMessage = theMessage as TLampMessage;
....

}
...
if( theMessage is TVoiceMessage)
{
TVoiceMessage vMessage = theMessage as TVoiceMessage;
.....
}

if( theMessae is TStartMessage)
{
TStartMessage sMessage = theMessage as TStartMessage;
....

}

....

}
回复
bloodish 2008-12-02
if( theMessage is TLampMessage )
这个判断没有必要,as其实已经包含了is的判断,你只需要判断as返回的结果是不是null,在做其他操作即可.
TLampMessage lMessage = theMessage as TLampMessage
if(lMessage != null)
{
//to do
}
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2008-12-02 03:14
社区公告

让您成为最强悍的C#开发者