CLR via C#(03)- 对象创建和类型转换
一、 创建对象
CLR要求用new操作符创建对象,这个操作符在编译时产生的IL指令为newobj。例如:
Student XiaoJing=new Student(“XiaoJing”,”1986”);
那么在创建过程中,究竟发生了什么事呢?
- 分配空间。在托管堆中分配该类所需要字节数的内存空间。
- 初始化对象的附加成员。每个对象有两个附加成员:一是指向类方法表的指针;二是SyncBlockIndex成员,CLR用该字段进行线程同步控制,某些位还可以用作垃圾回收标 记等等。CLR通过这两个成员管理对象实例。
- 调用构造函数。其间可以传入指定的参数。
二、 类型转换
C#中,向基类转换直接隐式进行就可以;向派生类转换则需要显示进行,因为有可能会失败。在运行时,CLR会检查转型操作以确保是将对象转化为它的实际类型或者它的基类型。
class Animal { }
class Dog : Animal { }
Animal a=new Dog();
Dog b=(Dog)a; //显示转换,基类向派生类
Animal a=new Dog(); //隐式转换,派生类向基类
IS和AS?
要想检查对象和类是否兼容,有两种方式:Is和As。
- Is关键字在使用中经常需要转换两次。首先判断类型兼容,然后常伴随着一次显示转换。
If(a is Dog)//第一次转换
{
Dog g=a;//第二次转换
………
}
- As关键字转换一次,然后判断转换后的变量是否为null就可以了。所以该方式性能相对高一些。
Dog g=a as Dog;//转换一次,失败则为null
If(g!=null) {…}
三、 实例考察
下面来看一个类型转换的例子,看每行代码在编译和运行时是否能够正确通过?如果你都答对了,那么本节课的理解就及格了。
还是上面的两个类,Animal和Dog,主要考察类型转换的知识。
代码 |
正确 |
编译错误 |
运行错误 |
class Program |
|||
{ |
|||
static void Main(string[] args) |
|||
{ |
|||
Object o1 = new Object(); |
√ |
||
Object o2 = new Animal(); |
√ |
||
Object o3 = new Dog(); |
√ |
||
Object o4 = o3; |
√ |
||
Animal Animal1 = new Animal(); |
√ |
||
Animal Animal2 = new Dog(); |
√ |
||
Dog Dog1 = new Dog(); |
√ |
||
Animal Animal3 = new Object(); |
√① |
||
Dog Dog2 = new Object(); |
√② |
||
Animal Animal4 = Dog1; |
√ |
||
Dog Dog3 = Animal2; |
√③ |
||
Dog Dog4 = (Dog)Dog1; |
√ |
||
Dog Dog5 = (Dog)Animal2; |
√ |
||
Dog Dog6 = (Dog)Animal1; |
√④ |
||
Animal Animal5 = (Animal)o1; |
√⑤ |
||
Animal Animal6 = (Dog)Animal2; |
√ |
||
} |
|||
} |
错误点解析:
① Animal Animal3 = new Object();
基类向派生类转换应该显示进行,所以编译就报错了。实际上就算改成显示转型也会发生运行时错误,因为对象类型不兼容。可以尝试改成Animal Animal3 = (Animal)o2;
② Dog Dog2 = new Object();
理由同①,正解为Dog Dog2 =(Dog)o3;
③ Dog Dog3 = Animal2;
理由同①,正解为Dog Dog3 =(Dog) Animal2;
④ Dog Dog6 = (Dog)Animal1
基类向派生类显示转型,语法上没有错误因此编译通过。但在运行时,CLR会检查转型操作以确保是将对象转化为它的实际类型或者它的基类型。而Animal1对象是Animal类型而非Dog类型,因此转型时发生失败。如果添加一句Animal1=new Dog();再执行该转型则会成功。
⑤ Animal Animal5 = (Animal)o1;
理由同④。这里不再赘述了。
CLR via C#(03)- 对象创建和类型转换的更多相关文章
- JVM的艺术-对象创建与内存分配机制深度剖析
JVM的艺术-对象创建与内存分配机制深度剖析 引言 本章将介绍jvm的对象创建与内存分配.彻底带你了解jvm的创建过程以及内存分配的原理和区域,以及包含的内容. 对象的创建 类加载的过程 固定的类加载 ...
- (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态
1.访问控制(笔试题)1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问权 ...
- [你必须知道的.NET]第十九回:对象创建始末(下)
本文将介绍以下内容: 对象的创建过程 内存分配分析 内存布局研究 接上回[第十八回:对象创建始末(上)],继续对对象创建话题的讨论>>> 2.2 托管堆的内存分配机制 引用类型的实例 ...
- [你必须知道的.NET]第十八回:对象创建始末(上)
本文将介绍以下内容: 对象的创建过程 内存分配分析 内存布局研究 1. 引言 了解.NET的内存管理机制,首先应该从内存分配开始,也就是对象的创建环节.对象的创建,是个复杂的过程,主要包括内存分配和初 ...
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- Progress.js – 为页面上的任意对象创建进度条效果
Progress.js 是一个 JavaScript 和 CSS3 的库,它帮助开发人员为网页上的每个对象创建和管理进度条效果.你可以设计自己的模板,进度条或者干脆定制. 您可以使用 Progress ...
- 《JavaScript模式》第5章 对象创建模式
@by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...
- C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...
- Spring对象绑定与类型转换
Spring对象绑定与类型转换 Spring的框架体系中,到处充斥着对象绑定从bean的初始化autowired属性,SpringMvc 中对对象的绑定等.Spring对象绑定和类型转换在Spring ...
随机推荐
- [HDU4507]吉哥系列故事——恨7不成妻
[HDU4507]吉哥系列故事--恨7不成妻 试题描述 单身!依然单身!吉哥依然单身!DS级码农吉哥依然单身!所以,他生平最恨情人节,不管是214还是77,他都讨厌!吉哥观察了214和77这两个数,发 ...
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- ReLU 和sigmoid 函数对比以及droupout
参考知乎的讨论:https://www.zhihu.com/question/29021768 1.计算简单,反向传播时涉及除法,sigmod求导要比Relu复杂: 2.对于深层网络,sigmod反向 ...
- java中的jComBox的基本用法
jComBox获取选中的字符串 getSelectedItem().toString()返回一个字符串 getSelectedItem()返回一个对象. getSelectedIndex()得到选择值 ...
- PHP中为位运算符(几乎很少用)
PHP语言里的位运算符&.|.^ .~.〈〈 .〉〉 "&" 按位与运算 按位与运算符"&"是双目运算符.其功能是参与运算的两数各对应的 ...
- Linux的后台执行进程之nohup
nohup 用途:LINUX命令用法,不挂断地运行命令. 语法:nohup Command [ Arg ... ] [ & ] 描述:nohup 命令运行由 Command 参数和任何相关 ...
- Codeforces 519 E. A and B and Lecture Rooms
Description 询问一个树上与两点距离相等的点的个数. Sol 倍增求LCA. 一棵树上距离两点相等,要么就只有两点的中点,要么就是与中点相连的所有点. 有些结论很容易证明,如果距离是偶数,那 ...
- django 的模板语言
1.模版的执行 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. def current_datetime(req ...
- 9. JEB 1.5插件编写一
2.0之后好像新增加了很多API,有所区别 本文采用Java+Eclipse作为开发环境 插件支持的语言 文档: jeb-1.5/doc/index.html 一.Hello World工程 1. ...
- @ResponseBody返回不能正确接收
Spring-MVC中@ResponseBody返回Bean到前台接收这么一串代码,还套着HTML标签: The resource identified by this request is only ...