在读.Net 框架设计的时候,关于C#中类型转化中的部分内容,在此总结记录,分享予大家。

首先,我们声明一个简单的继承关系。

Class Father
{
Int x;
} Class Child:Father
{
Int32 y;
}

下面哪些类型转化是可行的,哪些是CTE(编译时错误),哪些是RTE(运行时错误)?

编号              语句                                                      OK                      CTE                     RTE                     
1 Father f1=new Child();    
2 Child c1=new Father();    
3 Child c2=f1;    
4 Child c3=(Child)f1;    
5 Object o1=new Object();    
6 Child c4=(Child)o1;    

C#不需要特殊的语法就能把一个对象转化为其基类型。这是因为从派生对象向基类转化的过程是安全可靠的。所以,CLR允许编号1这样的语法,但是绝对不允许编号2这样的语法。因为从派生对象往基类转化是不安全的。所以当我们想要把基类对象转化为派生类对象的时候,必须显式的进行强制转化,像编号4这样。注意:在某些情况下,这种显式的转化会出现RTE,即使它们逃过了编译器的“法眼”,如编号6所示。

为什么编号6会出现CTR,这是因为Object o1和类Child是“不兼容的”。

什么是“兼容”呢?C#中关键字 is 就是用来判断是否兼容的。

Father f5=new Father();
Father f6=new Child();
Child c5=new Child(); Bool b0=f5 is Father;//b0=true;
Bool b1=f5 is Child;//b1=false;
Bool b2=c5 is Father;//b2=true;
Bool b3=f6 is Child;//b3=true;

Bool b=“对象引用” is “类型”。如果“对象引用” 所指对象是 “类型” 的一个实例、或者“对象引用”所指的对象是 “类型” 的派生类一个实例对象,则说明是兼容的。

我们举个《.net框架》上的例子,

    Object o=new Object();
//此处使用is要做两次类型判断 if(o is Employee)
{
Employee e=(Employee)o;
}
//c此处使用as只需做一次类型判断
Employee e=o as Employee;

if(NULL!=e)
{
//使用e
}

实际,as所做的就是——如果类型是兼容的,那么就把e执行o所指向的对象。再如下例:

Int32 x = ;
object o = x as Object;
if (o != null)
{
Console.WriteLine(o.GetType().FullName.ToString());//System.Int32
}

抛砖引玉,更多的东西读者自己去品味吧。

C# 中的as和is小结的更多相关文章

  1. 1:CSS中一些@规则的用法小结 2: @media用法详解

    第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下     at-rule ...

  2. Go语言中字符串的查找方法小结

    这篇文章主要介绍了Go语言中字符串的查找方法小结,示例的main函数都是导入strings包然后使用其中的方法,需要的朋友可以参考下   1.func Contains(s, substr strin ...

  3. opengl中VAO,VBO,IBO用法小结(zz) 【转】

    http://cowboy.1988.blog.163.com/blog/static/751057982014380251300/ opengl中VAO,VBO,IBO用法小结 这三个玩意全面取代旧 ...

  4. opengl中VAO,VBO,IBO用法小结【转】

    http://cowboy.1988.blog.163.com/blog/static/751057982014380251300/ opengl中VAO,VBO,IBO用法小结 这三个玩意全面取代旧 ...

  5. Android中static和final用法小结

    Java关键字static.final使用小结 static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是 ...

  6. akka actor中的基本概念(学习小结)

    注:本文章是看blog后的一个阶段小结,只作为个人笔记, 原文链接:http://www.iteblog.com/archives/1154 官网地址贴上:http://doc.akka.io/doc ...

  7. 腾讯优测优分享 | Android适配中的一些特殊情况小结

    腾讯优测是专业的自动化测试平台,提供全面兼容适配测试,远程真机租用等多维度的测试服务! 作为一名"艰苦卓绝"的软件工程师,我在开发路上经常被各种奇葩情况虐的体无完肤...今天就想与 ...

  8. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  9. Storm中Spout使用注意事项小结

    Storm中Spout用于读取并向计算拓扑中发送数据源,最近在调试一个topology时遇到了系统qps低,处理速度达不到要求的问题,经过排查后发现是由于对Spout的使用模式不当导致的多线程同步等待 ...

随机推荐

  1. linux安装VMware-tools,

    系统中可能预装了open-vm-tools和VMware-tools冲突,所以需要先将前者卸载在进行安装不同系统卸载使用的命令不一样,centos的命令可以使用rpm,ubuntu的命令可以使用dpk ...

  2. Centos 6.5 搭建l2tp 服务端和客户端

    废话不多说直接上步骤. server #epel仓库愿安装 rpm -ivh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release- ...

  3. myeclipse连接数据库sql server

    1.打开数据库Microsoft sql server2008,输入以下命令: 此时可是看到端口号为1619,记住此端口号,等会儿会用到. 2.打开myeclipse2014,找到最上方的myecli ...

  4. NodeJS入门(五)—— process对象

    process对象用于处理与当前进程相关的事情,它是一个全局对象,可以在任何地方直接访问到它而无需引入额外模块. 它是 EventEmitter 的一个实例. 本章的示例可以从我的Github上下载到 ...

  5. Lesson 1 A private conversation

    Text Last week I went to the theatre. I had a very good seat. The play was very intersting. I did no ...

  6. 新功能发布!Markdown写博客!

    有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起--它就是Markdown. 现在我们实现了博客对Markdown的内置支持,可以让您轻松地在园子里用这个神奇的语言写博客! &qu ...

  7. 在MotionBuilder中绑定C3D动作和模型

    [题外话] 实验室人手不足,虽然自己连MotionBuilder一点都没有用过,但是老板叫自己干也只能硬着头皮上了.本文详细介绍了MotionBuilder 2013中的摄像机操作以及在MotionB ...

  8. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...

  9. spark参数调优

    摘要 1.num-executors 2.executor-memory 3.executor-cores 4.driver-memory 5.spark.default.parallelism 6. ...

  10. Atitit 代码复用的理解attilax总结

    Atitit 代码复用的理解attilax总结 1.1. 继承1 1.1.1. 模式1:原型继承1 1.1.2. 模式2:复制所有属性进行继承 拷贝继承1 1.1.3. 模式3:混合(mix-in)1 ...