设计中,关于 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;
....

}
...
}



请高人赐教,谢谢

...全文
140 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
}

110,550

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧