c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]
前言
使用as和强制类型转换的时候的区别是否仅仅是代码形式上的区别。
答案是肯定不是的。
正文
看两段代码:
object o = Factory.GetObject();
Student student = o as Student;
if (student != null)
{
//dosomething
}
和
object o = Factory.GetObject();
Student student = o as Student;
try
{
Student student = (Student)o;
if (student != null)
{
//dosomething
}
}
catch (InvalidCastException e)
{
var str = e.Message;
}
问题来了,这两者有什么区别?
首先第二个里面有一个损失性能的地方,就是try{}catch{}。
那么可以肯定一点就是在程序健壮性相同的情况下,使用as最好。
问题又出现了,那么什么时候不能用as呢?或者as 和 强制类型转换之间差别是什么呢?
as 转换的局限性在于,他只会做简单的装箱和拆箱工作,而不会去做一些类型转换。
也就是说,如果待转换的对象既不属于目标对象,也不属于派生出来的类型那么是不能转换的。
这里就有人奇怪了,如果两者都不属于那么转换失败正常啊。
怎么说呢,请考虑下面两种情况:
1.数值之间转换,比如int转long之类的。
2.自己实现转换,如:implicit
这两者as搞不定的。
比如说:
有一个child 类,想转学生类。
这样写:
public class Child
{
public static implicit operator Student(Child child)
{
return new Student();
}
}
然后我来这样写:
object o = Factory.GetObject();
Student student = o as Student;
if (student != null)
{
//dosomething
}
GetObject为:
public static implicit operator Student(Child child)
{
return new Student();
}
这样写是不成功的。
图我贴出来了。
那么我这样写,是否能成功呢?
object o = Factory.GetObject();
try
{
Student student = (Student)o;
if (student != null)
{
//dosomething
}
}
catch (InvalidCastException e)
{
var str = e.Message;
}
遗憾的是,这样写也是失败的。
那么为什么失败呢?
C# 有一个编译期和一个运行期。
而强制转换发送在编译期。
也就是说它读取的是object能不能转换为Student,而不是在运行期的Child。
好的,那么你可以这样。
object o = Factory.GetObject();
var c = o as Child;
try
{
Student student = (Student)c;
if (student != null)
{
//dosomething
}
}
catch (InvalidCastException e)
{
var str = e.Message;
}
这样是对的,但是对于编程学来说,谁会去这样写呢,在很多时候我们应该尽量避免装箱和拆箱。
在此总结一下,那就是as 运行在运行期,而cast 在编译期。
好的,as 完了后,看下is吧。
is 是遵守多态的,多态很好理解哈。
所以is 不是==的意思,而是是否是自己或者子类的意思。
如果你想要去得到具体的类型判断,那么请使用getType更为合适。
总结
使用as或者 强制类型转换没有定性的要求,看具体的方案,然后呢当可以使用as的时候尽量使用as,毕竟可以避免try catch这种消耗性能的东西。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库