在读.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. Handlebars.js的学习

    写在开头的话: 在使用Ghost搭建自己的博客的时候,发现不会Handlebars.js寸步难行,所以本人决定学习下Handlebars.js,因此在此做个记录 为什么选择Handlebars.js ...

  2. 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

    '*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...

  3. R语言:常用函数【转】

    数据结构 一.数据管理vector:向量 numeric:数值型向量 logical:逻辑型向量 character:字符型向量list:列表 data.frame:数据框 c:连接为向量或列表len ...

  4. 为什么google bazel构建工具流行不起来

    作者Jack47 转载请保留作者和原文出处 之前博主写了系列文章Google软件构建工具Bazel原理及使用方法介绍.最近使用了一段时间后,觉得这个东西不是一种通用的构建工具,很难对接到情况复杂的大的 ...

  5. java中文乱码解决之道(四)-----java编码转换过程

    前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...

  6. js中几种实用的跨域方法原理详解

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  7. jQuery AJAX 网页无刷新上传示例

    新年礼,提供简单.易套用的 jQuery AJAX 上传示例及代码下载.后台对文件的上传及检查,以 C#/.NET Handler 处理 (可视需要改写成 Java 或 PHP). 有时做一个网站项目 ...

  8. 微信小程序客服消息使用指南

    客服消息使用指南 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 功能介绍 用户可使用小程序客服消息功能,与小程序的客服人 ...

  9. DPI深度包检测

    最近在读网络协议方面的论文,接触到DPI技术.博主是个小白,这里写些查到的笔记. 原文出处因为比较多,杂乱.百度文库和许多地方都有,就不贴链接了. 1. DPI 全称为"Deep Packe ...

  10. Android开发-之SQLite数据库

    之前我们讲了如何将数据存储在文件中,那么除了这种方式呢,就是我们常见的大家都知道的将数据存储在数据库当中了. 将数据存储在数据库中的优势: 1)存储在数据库中的数据更加方便操作,比如增.删.改.查等 ...