c# as疑惑
有点疑惑,关于as,看代码
不了解了,as不是相当于c++的dynamic_cast吗?
http://msdn.microsoft.com/zh-cn/library/cscsdfbt.aspx
//panel1下有Label、TextBox、ComboBox控件,执行以下代码发现Label被清空了
foreach(Control c in panel1.Controls)
{
TextBox tb=c as TextBox;
if(tb!=null)
tb.Text="";
}
不了解了,as不是相当于c++的dynamic_cast吗?
http://msdn.microsoft.com/zh-cn/library/cscsdfbt.aspx
...全文
请发表友善的回复…
发表回复
btman52 2014-04-10
- 打赏
- 举报
第一个说法不严谨,as只做判断,不进行任何转换操作。在il中as只有isinst一个opcode,内部操作为取typehandle遍历继承树,与is完全相同,效率大大高于try-catch
编译器会对强制转换做很多工作,例如判断是否为子类,是否含有explicit implicit函数等,内部实现也更为复杂
Regan-lin 2014-04-09
- 打赏
- 举报
我也以为是这样 但是实际是把Label的Text也清空了 .net framework 3.5[/quote]
如果就单单上面的代码,实在是想不明白你的为什么可以转换成功
threenewbee 2014-04-09
- 打赏
- 举报
as相当于安全的强制类型转换:
TextBox tb = c as TextBox;
其实就是
TextBox tb = null;
try
{
tb = (TextBox)c;
}
catch
{
}
由此可见,如果可以转换,那么它和强制类型转换一样,如果不可以转换,tb接受到null,不会丢出异常。
另外,你的代码可以简化:
foreach(TextBox tb in panel1.Controls.OfType<TextBox>())
{
tb.Text="";
}
__lhy 2014-04-09
- 打赏
- 举报
我也以为是这样 但是实际是把Label的Text也清空了 .net framework 3.5
tcmakebest 2014-04-09
- 打赏
- 举报
楼主看花眼了啵
Regan-lin 2014-04-09
- 打赏
- 举报
就你这个代码清空的应该是textbox控件吧,你这个强制转换其他控件,只有textbox控件转换成功的,只有这个才会执行下面的if条件的
guxingfeiyu 2014-04-09
- 打赏
- 举报
纠正一下:textbox和textbox的继承类可以转换成功。
bruce_华仔 2014-04-09
- 打赏
- 举报
出错是不会的。你遍历Panel1中所有控件,并将他转换为TextBox,然后判断如果成功转为为TextBox则清空TextBox中的值,否则跳过
小猪八Q 2014-04-09
- 打赏
- 举报
正因为会出现空的情况,所以才需要if判断
理论上说,没什么错误,lz跟踪调试下吧,然后看看是不是有其他的代码执行了对Label的处理
王子文龙 2014-04-09
- 打赏
- 举报
as其实就是类型转换,判断是否兼容于 as之后的类型,如果不兼容,返回null
黑子大哥 2014-04-09
- 打赏
- 举报
汗、、、
as会转换啊,如果不是textbox类型应该转换为空啊,不应该执行if 啊
宝_爸 2014-04-09
- 打赏
- 举报
不会吧,不应该转换成功啊,单步跟踪试一试。