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

请教一个引用类型转换的问题!

drumzjh 起点 Web前端工程师  2012-01-24 03:13:42
今天学引用类型转换的时候,其中有点总是无法理解,以下是我的代码:
class Program
{
static void Main(string[] args)
{
Person[] pers = new Person[4];//定义一个Person类数组
Chinese ch1 = new Chinese();
Chinese ch2 = new Chinese();
Japanese jp1 = new Japanese();
Japanese jp2 = new Japanese();
pers[0] = ch1;
pers[1] = ch2;
pers[2] = jp1;
pers[3] = jp2;
for (int i = 0; i<pers.length;i++)
{
if(pers[i] is Chinese)
{
Chinese c = pers[i] as Chinese;
c.SayHello();
}

else if (pers[i] is Japanese)
{
Japanese j = pers[i] as Japanese;
j.SayJapanese();
}
}
Console.ReadKey();
}
}

class Person
{
}
class Chinese
{
public void SayHello()
{
Console.WriteLine("你好,我是中国人!");
}
}

class Japanese: Person
{
public void SayJapanese()
{
Console.WriteLine("阿里阿多!");
}
}[/size]

由于不知道为何不能粘贴代码,我只好手动写了这些,格式有不清楚的地方请各位见谅。
这里我搞不明白的地方就是我用红色标起的地方,既然已经定义了if(pers[i] is Chinese)为什么还要再对pers[i]进行一次强制转换才能赋值给c?请各位高手帮忙解答一下,谢谢。
...全文
89 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dustindwind 2012-01-25
事实上,如果你使用FxCop之类的代码检查工具的话,这段代码
if(pers[i] is Chinese)
{
Chinese c = pers[i] as Chinese;
c.SayHello();
}
会产生警告,大概意思是说这么写代码会带来性能问题,因为这里会产生两次类型转换:
第一次是
if(pers[i] is Chinese)
第二次是
Chinese c = pers[i] as Chinese;
建议的做法是:
Chinese c = pers[i] as Chinese;
if (c != null)
{
c.SayHello();
}
回复
drumzjh 2012-01-24
了解了,谢谢各位
回复
WAN 2012-01-24
if做了判断只是“你”知道了,但到下一个语句,系统还是要求根据语法进行转换
你也可以这样:
Chinese c = pers[i] as Chinese;
if(c != null)
{
c.SayHello();
}
else
{
Japanese j = pers[i] as Japanese;
if(j != null)
{
j.SayJapanese();
}
}
回复
cstur4 2012-01-24
你也说了那个是判断,不是转换。你要先确认它是,才能转换吧。程序,没那么智能。
[Quote=引用 4 楼 drumzjh 的回复:]

对啊,我就是不理解,前面的if既然已经做了判断了,比如我前面的例子
if(per[i] is Chinese)
{Chinese c = per[i] as Chinese; }
既然if里面已经做了判断,当per[i]是Chinese的时候,进行转换,那不是多此一举了吗?
[/Quote]
回复
drumzjh 2012-01-24
对啊,我就是不理解,前面的if既然已经做了判断了,比如我前面的例子
if(per[i] is Chinese)
{Chinese c = per[i] as Chinese; }
既然if里面已经做了判断,当per[i]是Chinese的时候,进行转换,那不是多此一举了吗?
回复
Ultimate 2012-01-24
如果你学过asp.net你会发现清空清空页面所有的 textbox有这句。 foreach( Contarl c in this.Contrals)
{
if(c is textbox)
{
(c as Textbox).text="";
}
}
这段跟你的意思很像
回复
drumzjh 2012-01-24
这个我知道啊,但是既然if已经判断了是否为Chinese类型,比如per[i],为什么还要用as进行转换呢?
回复
mizuho_2006 2012-01-24
If判断per[i]是否能转换为Chinese类型(当能转换时返回true),如果能转换,就用as操作符进行转换。as操作符不是强制转换,强制转换是在类型前加一个括号,里面写上要强制转换的类型。
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2012-01-24 03:13
社区公告

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