前言

使用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. ServerVariables集合

    当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合.这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接 ...

  2. USACO Training Section 1.1 坏掉的项链Broken Necklace

    题目描述 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 第一和第二个珠子在图片中已经被作记号. 图片 A ...

  3. Python(Redis 中 Set/Zset 类型数据和其他操作)

    1.redis 基本操作命令 Set 操作 Set 集合就是不允许重复的列表 无序集合 sadd(name,values) 给 name 对应的集合中添加 1 个或多个元素 import redis ...

  4. 【Swift】获取UILabel中点击的某个功能标签文字并作出响应动作

    1.需求 首先.针对UILabel中显示的多个功能标签,作出颜色标记提示. 其次.对关键字作出点击响应动作. 如图所示: 解决: 1.使用正则匹配到关键字 public static var hash ...

  5. 自动化运维工具Ansible之Roles测验详解

    Ansible Roles 详解与实战案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. 该用 ...

  6. Python 为什么抛弃累赘的花括号,使用缩进来划分代码块?

    大家好,这是"Python为什么"系列节目的文字稿(文末有观看地址). 本期话题:Python 为什么使用缩进来划分代码块,而不像其它语言使用花括号 {} 或者 "end ...

  7. 【Kafka】Kafka集群基础操作!新手上路必备~

    目录 bin目录 Topic命令概览 创建Topic 查看Topic 描述Topic Producer生产数据 Consumer消费数据 增加topic分区数 增加配置 删除配置 删除Topic 所有 ...

  8. ssh暴力破解解决方案(Centos7更改端口)

    服务器默认ssh远程连接端口为22端口,通常通过22远程连接的话,容易有ssh暴力破解的风险,给我们造成一定的损失.下面是更换ssh端口过程: 1.添加ssh端口 vim /etc/ssh/sshd_ ...

  9. html5 canvas画云

    使用函数画出天空的云层图像: y 主要使用到的是数学的圆与弧度之间转换关系: 代码如下 //div对象 var parentContainer = document.getElementById(&q ...

  10. 前后端分离产生的跨域问题的解决方案之--jsonp、nginx代理、设置头信息等

    前言 在前后端没有分离的时候,前端开发要么是写静态页面,数据渲染后端来做,要么就是前端的页面和后端的代码刚开始的时候就合并在一起,每次后端代码更新了之后,前端也要更新一下代码,然后重启一下服务,还是比 ...