了解.NET的类型很重要

.NET的主要类型分为值类型和引用类型

区分这2种类型

1、内存方面

值类型:

包括枚举enum 和结构 struct

内存分配:

实例通常分配在线程的堆栈上,并且不包括任何指向实例数据的指针,因为变量本身就包含了其实例数据,内存不由GC来控制,作用域结束时,值类型会自行释放

引用类型:

包括类,接口,数组,委托

内存分配:

实例分配在托管堆上,保存了实例数据的内存引用,由GC(Garbage Collection)来控制其回收

特殊情况:

出现嵌套的时候,即值类型嵌套引用类型,引用类型嵌套值类型,那么内存又是如何分配的呢?

值类型实例总是分配在他声明的地方,引用类型实例总是分配在托管堆上

2、sizeof()运算符用于获取值类型的大小,但是不适用于引用类型

3、值类型使用new操作符或者赋初值完成初始化,而单纯的定义没有完成初始化,此时对成员的引用将不能通过编译

4、引用类型在性能上欠于值类型

5、值类型继承自System.ValueType ,而System.ValueType 又继承自 System.Object

6、值类型是密闭的,不能作为其他类型的基类,但是可以单继承或者多继承接口,而引用类型一般有继承性

7、值类型没有多态,但是引用类型有多态

值类型和引用类型的互相转换

装箱和拆箱

按值传递和按引用传递:

按值传递

不管是引用类型按值传递还是值类型按值传递,都是在堆栈上复制一个对象的实例,将这个新的实例去传递,不改变原有实例的值。

按引用传递

是直接将指向实例的引用地址进行传递,改变了地址,则会改变参数的值

传递的是参数的地址

值类型按引用传递时实现的是对值类型参数实例的直接操作

Ref和Out均为引用传递,区别 是Ref参数传递前该参数必须已经被初始化,而out参数传递不需要

用户自定义类型转换的实现方式:

Static 访问修饰操作符 转换修饰操作符 operator 类型 (参数列表)

所有的转换都必须是static 见P160

如果声明了一个类对象指向一个托管堆地址,但是该类对象改变了引用,那么之前的地址会被GC回收

装箱和拆箱

装箱

将值类型数据转换成无类型的引用对象

过程:

1、 内存分配

2、 实例拷贝

3、 地址返回(不包含这步,但是常常伴随着一起发生)

拆箱

获取已装箱对象中来自值类型部分字段的地址,在执行上不包括字段的拷贝过程

过程:

1、 实例检查

2、 指针返回

3、 字段拷贝

遵循的规范:

1、 拆箱后必须保证执行后的结果是原来未装箱时的类型

2、 引用类型一直保持着装箱状态,装箱和拆箱是针对值类型而言的

应该尽量避免装箱拆箱的发生,可以考虑使用泛型

ArrayList,HashTable,Emun均易引起装箱

转载于:https://www.cnblogs.com/stayhungry/archive/2013/05/06/3063837.html

《你必须知道的.NET》第五章读书笔记相关推荐

  1. [你必须知道的.NET] 第五回:深入浅出关键字---把new说透(转载)

    [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 作者:Anytao 本文将介绍以下内容: 面向对象基本概念 new关键字深入浅出 对象创建的内存管理 1. 引言 园子里好像没有或者 ...

  2. Android深度探索--HAL与驱动开发----第五章读书笔记

    第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...

  3. 《Java8实战》-第五章读书笔记(使用流Stream-02)

    付诸实战 在本节中,我们会将迄今学到的关于流的知识付诸实践.我们来看一个不同的领域:执行交易的交易员.你的经理让你为八个查询找到答案. 找出2011年发生的所有交易,并按交易额排序(从低到高). 交易 ...

  4. 学习_你必须知道的.net2_第四章_一切从IL开始

    IL体验中心:  1: .class表示是一个类  ;  .public表示访问权限  ; auto表示程序加载时内存由CLR决定的,而不是程序本身 .ansi实现托管与非托管代码的无缝转换:   . ...

  5. 读:[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

    一般说来,new关键字在.NET中用于以下几个场合,这是MSDN的典型解释: 作为运算符, 用于创建对象和调用构造函数. 本文的重点内容,本文在下一节来重点考虑. 作为修饰符,用于向基类成员隐藏继承成 ...

  6. [你必须知道的.NET] 第五回:深入浅出关键字---把new说透

    本文将介绍以下内容: 面向对象基本概念 new关键字深入浅出 对象创建的内存管理 1. 引言 园子里好像没有或者很少把new关键字拿出来说的,那我就占个先机吧,呵呵.那么,我们到底有必要将一个关键字拿 ...

  7. 《Java必须知道的300个问题》读书总结

    这本书是在图书馆随便逛的时候找到的书.花了一下午看完了,感觉有用的地方不是很多,大部分都是些概念,并没有太大用途.不过里边有些东西还是可以看一看的,总结如下. Java语言基础 1.表达式3-2.6= ...

  8. JS高级程序设计第五章读书笔记

    1.引用类型的值(对象)是引用类型的一个实例.在ES中,引用类型是一种数据结构,用于将数据和功能组织在一起.它们也长被称为类,但这并不妥当.因为ES在技术层面上是一门面对对象的语言,但它并不具备传统的 ...

  9. 整理下Anytao《你必须知道的.Net》全文链接

    不辞辛苦的一番抗吃赛抗吃喂o(∩_∩)o... [你必须知道的.NET] 第一回:恩怨情仇:is和as http://www.cnblogs.com/anytao/archive/2007/05/23 ...

最新文章

  1. pcl_filters模块api代码解析
  2. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式
  3. TCP协议三步挥手与四步挥手
  4. iOS 11.4.1 正式版越狱
  5. Android之AsyncTask学习笔记
  6. DBA突破35岁难题的三种策略
  7. Spring Boot(5)---第一个Spring Boot应用程序
  8. 关系查询处理 查询优化 论文_2019年4月湖北自考成绩查询入口已开通
  9. python的运行方式有哪两种_Python基础:Python运行的两种基本方式
  10. python 线程-threding示例使用
  11. 用ssh2连接linux实现putty功能范例代码
  12. solaris查看服务器信息,Solaris下如何显示服务器虚拟内存统计信息
  13. Linux MPLS 总结
  14. java二路归并排序算法_二路归并排序的java实现
  15. Listen1 - 让你畅享全网音乐!你值得拥有!
  16. 关于邮箱的POP协议、imap协议、imap协议简单讲解
  17. Ant Design Pro从零到一(页面创建)
  18. 风控Python绘图技法代码示例
  19. 四大垃圾回收算法七大垃圾回收器
  20. 大数据|Spark技术在京东智能供应链预测的应用案例深度剖析(一)

热门文章

  1. 做自媒体和有没有文化没有太大关系
  2. 互联网,就像一条条丝线一样,将每个个体、每个组织串联在一起
  3. 我发现每一个生意做得不错的人都很会说话
  4. 同一机器部署多个JVM
  5. “S“ is the acronym for Super
  6. 运行报错SecureCRT: error while loading shared libraries: libjpeg.so.8:
  7. python3 windows console 输出乱码问题
  8. java抽象类代码_java – 抽象类和通用代码
  9. 软件测试宝藏图_tSQLt –数据库单元测试中被遗忘的宝藏
  10. 一:MyBatis知识整理(1)