我们都知道CLR最重要的一个特性就是类型安全,它在运行时就知道对象类型。

但我们会经常用到将一种类型转换成另一种类型,CLR也允许将对象转成他的实际类型,或者是它的基类型。

在C#中,支持隐士转换成它的基类型。

类型转换会用到以下方式:

 public class EntityBase
{
public int Id {get; set;}
}
public class User
{
public string Name {get; set;}
} .....
public static void Main()
{
var user = new User();
var entity = user; // 隐士转换
Object obj = user;
var user2 = (User) obj; // 显示转换
var user3 = obj as User; // as操作符转换
}

其中 (User) obj 用了强制转换,如果原始类型不是User的时候,会抛出异常。

obj as User 会先判断类型,然后才会转换,如果原始类型不是User的时候,会返回null,反而不会抛出异常。

有的时候为了处理异常,需要加一些判断,比如使用如下判断语句,先判断类型是否正确:

 if(obj is User){
var user2 = (User) obj;
// or
var user3 = obj as User;
}

这样也可以实现,但是我们可以换另外一种给方式去写,会更简单。

因为对obj as User而言 会先判断类型,然后才会转换,那这样的话就会跟外层的is语句有重复判断的部分,在单条语句不会引起很大的性能方面的损耗,但是如果在一个比较大的循环语句中这样大量的重复判断,性能损耗将是一个很大的影响。

 var user3 = obj as User;
if(user3 is null)
{
// ....
}

如上写法,依据as语法的特性,判断返回结果的方式。

最新文章

  1. Python新建动态命名txt文件
  2. TweenMax学习一
  3. 根据SQL Server排序规则创建顺序GUID
  4. css margin 参数
  5. servlet等一些砸碎的
  6. Nginx安装(zhuan)
  7. Tools之FindBugs
  8. HDU 1024 (不重叠m段最大和) Max Sum Plus Plus
  9. 安卓环境搭建(1)hellow world
  10. docker 学习笔记20:docker守护进程的配置与启动
  11. linux命令readlink
  12. 转 Android中通过广播方式调起第三方App
  13. 使用Pushlet将消息从服务器端推送到客户端
  14. xx-net 使用方式
  15. C++数据
  16. PHP 高级过滤器
  17. GIT的使用(Gitlab上传本地仓库代码,Webstorm修改更新)
  18. vim常用命令行备忘总结
  19. mui 动态加载数据出现的问题处理 (silder轮播组件 indexedList索引列表 下拉刷新不能继续加载数据)
  20. visual studio 加入zen-codding

热门文章

  1. ActiveMQ持久化
  2. PHP使用MongoDB类操作MongoDB数据库总结
  3. Python中产生随机数
  4. mybatis xml <choose>标签使用
  5. Centos7 手动编译 RabbitMQ ,并安装php amqp
  6. 转 mysql 文件系统空间满了
  7. 报错:java.lang.AbstractMethodError: nl.techop.kafka.KafkaHttpMetricsReporter.logger()Lcom/typesafe/scalalogging/Logger;
  8. Selenium登录126邮箱,chrome定位不到账号输入框解决办法
  9. Python赋值、浅拷贝、深拷贝
  10. jenkins最新版下载安装