前言

使用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这种消耗性能的东西。

c# 优化代码的一些规则——使用is或as和强制类型转换的区别[三]的更多相关文章

  1. c# 优化代码的一些规则——优先隐式类型[一]

    前言 说到底就是优先使用var,这个关键字,在c# 3.0中出现了. 首先要确认几点,一个就是var 是静态变量,而不是动态变量,也就是说使用var 你是不必去担心性能问题得, 百度百科: 1)静态存 ...

  2. c# 优化代码的一些规则——const 和 readonly[二]

    前言 在c# 的世界中,在初学的时候,可能很难区分readonly 和 const,两者都是不可修改. 看到这两个单词,我们想的是,最多他们的区别也不会太大.然后事实却出乎我们的意料. 正文 这两个声 ...

  3. c# 优化代码的一些规则——字符串使用优化[四]

    前言 在我们的程序中,经常使用到字符串,字符串的写法非常多,但是有一个问题就是我们写的字符串是否合适呢? 正文 内插符 介绍一个东西叫做内插字符,如下: static void Main(string ...

  4. PL/SQL 美化器&规则解释&优化代码

    前言 PLSQL有非常强大的自定义设置功能,比如美化文件规则, 使用者可以自行定义编辑规则,以便更好的优化SQL语句,增加可读性. 例如以下的部分代码,又长,分段不好,空格太多,结构散乱,还没有注释. ...

  5. [好文翻译]WEB前端性能优化的14条规则

    作为一个半前端工程师,而且只会写点HTML5和CSS3的“假”前端工程师,为了能更好地理解一下前端的花花世界,最近拜读了<高性能网站建设指南>一书,对作者提出的前端性能优化的14个规则获益 ...

  6. Yahoo网站性能优化的34条规则

    摘自:http://blog.chinaunix.net/uid/20714478/cid-74195-list-1.html Yahoo网站性能优化的34条规则 1.尽量减少HTTP请求次数 终端用 ...

  7. 为duilib的MenuDemo增加消息响应,优化代码和显示效果

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/38253297 第一部分 我在前一段时间研究了怎么制作duilib的菜单, ...

  8. Webpack 4教程:为什么要优化代码

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/07/30/webpack-4-course-part ...

  9. Android 性能优化:使用 Lint 优化代码、去除多余资源

    前言 在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范.可维护性. 今天,以“成为优秀的程序员”为目标的拭心将和大家一起精益求精,学习使用 Lint 优化我们的代码. 什么是 ...

随机推荐

  1. 网速慢?不!可能是DNS出了问题! 公共DNS优选之 BAT 百度、腾讯、阿里、谷歌DNS哪个更快?

    如果一下还是解决不了你的问题请这边走 首先是Google的DNS: 8.8.8.8 丢包严重 PASS但是扶墙的时候是必备的,如果有扶墙的需求的话可以备用. 二.百度DNS 180.76.76.76 ...

  2. 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree

    定理: 1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵. 2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度. 即 ...

  3. 题目分享F 二代目

    题意:T个点R种双向边,P种单向边,求点S到每个点的最短距离 分析:(这再看不出来是spfa就该**了) 首先,这题能否用spfa就看他是否有负环呗,显然,双向边的权值非负,单向边还有个啥政策,总之显 ...

  4. Linux安装Git-两种方式详细教程)

    一.Git介绍 Git --- The stupid content tracker, 傻瓜内容跟踪器.Linus Torvalds 是这样给我们介绍 Git 的. Git 是用于 Linux内核开发 ...

  5. Redis超详细总结

    NoSQL概述 一.数据存储的演化史 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付.在那个时候,更多的都是静态网页,动态交互类型的网站不多. 上述 ...

  6. 用 GitHub Action 构建一套 CI/CD 系统

    ​ 缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...

  7. 文件相关命令(find,tree,tar)文件属性信息 date

    6.13day11 文件相关命令(find,tree,tar)文件属性信息date 1 文件相关命令 1.1 find命令 查找文件用f find /root -type f -name " ...

  8. spring的单元测试

    如果spring 4.3.18这个版本的spring要使用junit,需要使用junit的junit-4.12之上的版本.使用这个版本junit的时 候需要引入hamcrest-all的jar包.之前 ...

  9. LeetCode--Squares of a Sorted Array && Robot Return to Origin (Easy)

    977. Squares of a Sorted Array (Easy)# Given an array of integers A sorted in non-decreasing order, ...

  10. 宽字节XSS跨站攻击

    简介 宽字节跨站漏洞多发生在GB系统编码. 对于GBK编码,字符是由两个字节构成,在%df遇到%5c时,由于%df的ascii大于128,所以会自动拼接%5c,吃掉反斜线.而%27 %20小于asci ...