这两章全是理论性的东西,我觉得不必过于钻牛角尖。理论这东西,只有在长期的实践中去慢慢领悟才会深刻。下面我只写些我认为重要的关键知识。

(一)类型转换

知识点:向基类型的转换被认为是一种安全的隐式转换;向派生类型转换时,只能显示转换。

举例:

Object o = new Employee();
Employee e = (Employee)o;

重要认知:CLR的类型检查会遍历继承层次结构,用每个基类型去核对指定的类型。

常用代码:(见下方代码段。CLR会检查两次对象的类型):

if(o is Employee){
Employee e = (Employee)o;
}

简化代码:(见下方代码段。CLR会检查一次对象的类型)

Employee e = o as Employee;
if(e != null){
//...
}

(二)值类型和引用类型

重要认知:1.栈中储存的是值类型、引用类型的指针(地址);堆中存储引用类型本身(不全是,见2)。

2.包含在引用类型内的值类型不会被存储在栈中,而是堆中(还是值类型,未被装箱),它被包含于引用类型对象中。

(三)重视装箱和拆箱对程序性能的影响

理解以下代码中的三次装箱:

public static void Main(){
Int32 v=;
Object o =v;
v=;
Console.WriteLine(v + ", " + (Int32)o );
}

第一次装箱是将v转换成object对象;第二次和第三次是因为WriteLine()方法要获取一个String对象,这样v和被拆箱的o会被再次装箱。

“装箱”发生的事情:

1. 在托管堆中分配内存,包括值类型字段需要的内存量+类型对象指针的内存量+同步块索引需要的内存量。

2. 值类型的字段复制到新分配的堆内存。

3. 返回对象的地址。(地址是对对象的引用(指针),值类型变成引用类型)

概念应用:

重写类中的ToString()方法,可以避免使用ToString()方法时的装箱问题。

public class A
{
private int x;
public override String ToString()
{
return string.formart("{0}",x);
}
}

注意重写的ToString()方法内部如果调用了base.ToString();外部调用此方法时,值类型依然会被装箱。

《CLR.via.C#第三版》第二部分第4,5章节读书笔记(二)的更多相关文章

  1. 精通正则表达式(第三版)——Mastering Regular Expressions,3rd Edition——读书笔记1

    基础知识介绍: 子表达式匹配 环视 引号内的字符串:"(^")*" 12小时制:(1[0123]|[1-9]):[0-5][0-9]*(am|pm) 24小时制:(([0 ...

  2. Java 线程第三版 第八章 Thread与Collection Class 读书笔记

        JDK1.2引入最有争议性的改变是将集合类默觉得不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: j ...

  3. 精通正则表达式(第三版)—Mastering Regular Expressions,3rd Edition—读书笔记2

    1.肯定断言:必须匹配一个字符 排除型字符组:匹配未列出字符的字符组 2.范围表示法——列出范围内所有的字符 大多数情况下,不会影响执行速度.但是,某些实现方式不能完全优化字符组.所以,最好是有范围表 ...

  4. 《CLR.via.C#第三版》第一部分读书笔记(一)

    最近开始仔细研读<CLR.via.C#第三版>这本书.读pdf文档确实很累.建议有条件的朋友还是买书看吧. 我的笔记用来记录我对这本书的理解,简化下逻辑,对每个部分我觉得是要点的进行归纳总 ...

  5. Python核心编程第三版第二章学习笔记

    第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...

  6. 《CLR.via.C#第三版》第二部分第8,9章节读书笔记(四)

    三种类型的构造方法: 实例构造器(引用类型):实例构造器永远不能被继承(所以方法前没有修饰符):如果类的修饰符为static(sealed和abstract),编译器根本不会在类的定义中生成一个默认构 ...

  7. 《CLR.via.C#第三版》第二部分第12章节 泛型 读书笔记(六)

    终于讲到泛型了.当初看到这个书名,最想看的就是作者对泛型,委托,反射这些概念的理解.很多人对泛型的理解停留在泛型集合上,刚开始我也是,随着项目越做越多,对待泛型的认识也越来越深刻. 泛型的概念:泛型是 ...

  8. 《CLR.via.C#第三版》第二部分第6,7章节读书笔记(三)

    第6章讲的是类型和成员基础 重要认知:虚方法 虚方法的设计原则:设计一个类型时,应尽量减少所定义的虚方法的数量. 首先,调用虚方法的速度比调用非虚方法慢. 其次,JIT编译器不能内嵌虚方法,这进一步影 ...

  9. 《CLR.via.C#第三版》第二部分第13章节 接口 读书笔记(七)

    这章的书写感觉很普通,是些基础的认知知识. 其中一点的重要认知,泛型接口的好处(其实也是使用泛型的好处之一):编译时类型安全&处理值类型时减少装箱. 再说点书上没有的.本来这些知识我打算另外分 ...

随机推荐

  1. 添加Properties取值和枚举取值

    <!--配置文件--><property name="ppp"> <props> <prop key="11"> ...

  2. freeCodeCamp:Where do I belong

    我身在何处? 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引. 举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变成[1,1 ...

  3. getElementsByTagName获得的不是数组的问题!

    getElementsByTag() returns a NodeList instead of an Array. You can convert a NodeList to an Array bu ...

  4. html5新特性之画布

    1.canvas的理解 canvas是一个矩形区域,在这个区域内,通过js可以对区域内的每一帧像素控制 2.js操作canvas对象 canvas对象.getContext("2d" ...

  5. .net 微信分享功能

    微信在国内目前无疑是最火的社交软件,智能手机装机必备. 微信api有java,php,Python语言的demo, 为毛没有C#的范例?兄长今天给各位带来一个.不叫哥(割)了,A股今天又暴跌[3912 ...

  6. Process 执行shell 脚本

    概述: Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的退出状态以及销毁(杀掉 ...

  7. nginx搭建笔记

    1. nginx安装 Env: Mac OS 10.10 Yosemite pcre: http://pcre.org/ $tar -zxf pcre-8.34.tar.gz $cd pcre-8.3 ...

  8. 如何使用jcraft 模拟SFTP登陆

    大家如果熟悉Linux系统话,对ssh,sftp,scp等命令非常熟悉.ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接.ssh 在连接和传送的过程中会加密所有的数据. 而今天我要介绍的 ...

  9. [LeetCode] 423 Reconstruct Original Digits from English

    Given a non-empty string containing an out-of-order English representation of digits 0-9, output the ...

  10. SqlIO优化

    1SqlIO优化 set statistics io on--sqlset statistics io off 2Sql占用CPU时间 select c.total_worker_time, c.la ...