关于值类型和引用类型方面的博客和文章可以说是汗牛充栋了,今天无意中又复读了一下这方面的知识,感觉还是有许多新感悟的,就此时间分享一下:

CLR支持两种类型:值类型和引用类型,看起来FCL的大多数类型是引用类型,但用的最多的还是值类型。引用类型总是从托管堆中分配,在用new操作符实例一个对象,返回对象内存地址存放在一个变量中。在使用引用类型时要了解其四个心理因素:

       1.内存必须从托管堆中分配

       2.堆上分配的每个对象都有一些额外成员,这些成员在使用前必须初始化。

       3.对象中的其他字节总是设为零。

       4.从托管堆分配对象时,可能强制执行一次垃圾回收。

由此可见,引用类型若是滥用势必造成过载。再看值类型,其是轻量级类型,一般分配在线程栈上也可嵌入到引用类型对象中,承载它的变量不包含指向实例的指针,当然也不受垃圾回收器的控制,因此值类型的使用缓解了托管堆的压力,减少了应用程序生存期内的垃圾回收的次数。

     C#中称为‘类’的都是引用类型,而值类型都成为结构或枚举。所有结构都是由抽象类型System.ValueType直接派生。而其本身有直接从Object派生,所有枚举从System.Enum抽象类型派生,Enum又从ValueType派生,环环相扣啊。

在设计自己的类型时,什么时候将定义成值类型呢?

      1.类型具有基元类型的行为(编译器直接支持的数据类型(像Int32,Int64等))

      2.类型不需要从其他任何类型继承。

      3.类型也不派生出其他任何类型。

      4.由于值类型在作为实参或是返回值的时候,需要进行相应字段的复制,如若实例过大,会造成一定的性能损失。

      所以要求类型实例较小(16字节以内),实例较大,但不作为方法实参传递和从方法返回也可。

--------------------------------------------------------------------------------------------------------------------------

关于值类型和引用类型的区别,大致列了一下几点:

     1.引用类型处于已装箱形式,值类型处于未装箱形式,两者也可通过一定方式互相转换(具体说明会在下一篇博客中详谈)

     2.值类型不应引入任何新的虚方法,所有方法都不能是抽象的,且都是隐式密封防止重写。

     3.将值类型变量赋给另一个值类型变量,会执行逐字段复制。将引用类型的变量付给另一个引用类型,只复制内存地址。两个或多个引用类型变量能引用堆上的同一个对象,对一个变量执行的操作可能影响到另一个变量引用的对象。相反,值类型变量独立,不互相影响。

     4.未装箱的值类型不在堆上分配,所以该类型的一个实例一旦不在活动,为他们分配的存储就会释放,不会等待垃圾回收

大致就是这些内容,有时真的需要慢慢品味。。。

转载于:https://www.cnblogs.com/mjys-gh/p/4986051.html

述说C#中的值类型和引用类型的千丝万缕相关推荐

  1. .NET中的值类型与引用类型

    .NET中的值类型与引用类型 这是一个常见面试题,值类型(Value Type)和引用类型(Reference Type)有什么区别?他们性能方面有什么区别? TL;DR(先看结论) 值类型 引用类型 ...

  2. C#中的值类型和引用类型

    文章目录 1 C#中的值类型 1.1 值类型示例程序 1.2 值类型(基本数据类型)的变量使用特点 2 C#中的引用类型 2.1 引用类型数据程序示例 2.2 引用数据类型的变量使用特点 3 变量类型 ...

  3. Windows Phone 开发起步之旅之二 C#中的值类型和引用类型

    今天和大家分享下本人也说不清楚的一个C#基础知识,我说不清楚,所以我才想把它总结一下,以帮助我自己理解这个知识上的盲点,顺便也和同我一样不是很清楚的人一起学习下.  一说起来C#中的数据类型有哪些,大 ...

  4. .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型

    C#中有谈到两种类型,值类型和引用类型(其实是CLR支持两种类型). 值类型包括:简单类型(int ,double,long,bool,char等,string除外),struct,enum 引用类型 ...

  5. golang中的值类型和引用类型

    值类型与引用类型 不管是Java还是golang中,都有值类型和引用类型的概念.在使用两者时,发现这两种语言之间还是有差异的. 值类型 值类型:这些类型的变量直接指向存在内存中的值,值类型的变量的值存 ...

  6. Java 基础 —— Java 中的值类型与引用类型

    一.值类型与引用类型 在 Java 中类型可分为两大类:值类型与引用类型.值类型就是基本数据类型(如 int.double 等),而引用类型是指除了基本的变量类型之外的所有类型(如通过 class 定 ...

  7. python中的引用类型_Python中的值类型与引用类型

    其实各个标准资料中没有说明Python有值类型和引用类型的分类,这个分类一般是C++和Java中的.但是语言是相通的,所以Python肯定也有类似的.实际上Python 的变量是没有类型的,这与以往看 ...

  8. C#中的值类型(value type)与引用类型(reference type)的区别

    ylbtech- .NET-Basic:C#中的值类型与引用类型的区别 C#中的值类型(value type)与引用类型(reference type)的区别 1.A,相关概念返回顶部 C#中有两种数 ...

  9. string:值类型?引用类型?[转]

    string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上下两章, ...

最新文章

  1. Camel In Action 读书笔记 (1)
  2. Android记录一个setTextColor常见的一个bug
  3. JPA关系映射系列一:one-to-one外键关联
  4. DIY人脸跟踪电风扇送女朋友(4)
  5. Python GIL
  6. win32 htmlayout dom操作demo
  7. mysql 视图 速度慢_mysql 视图查询速度慢
  8. forEach与for循环的差别
  9. wpf和winform的那点区别
  10. deian   授权用户 sudo权限
  11. eclipse 中配置外部 tomcat 的debug
  12. 图灵奖背后:一个奥斯卡拿到手软,一个公司卖了 160 亿
  13. 在一台机器设置两个listener(Oracle)
  14. 下列不属于计算机网络特点的是自主性,计算机网络技术B卷
  15. SQL 经典练习题 + 答案
  16. 百分百成功的ros安装教程,有手就能看懂!!!
  17. html中中文字体的代码
  18. 3ds max基础知识
  19. 山东省第三届数据应用创新创业大赛颁奖典礼在烟台举办
  20. 分数化小数 Fractions to Decimals [USACO 2.4]

热门文章

  1. j.u.c.locks.AbstractQueuedSynchronizer.Node
  2. Script:收集UNDO诊断信息
  3. Hibernate是啥?
  4. gitlab安装各种坑
  5. Camel之AsyncProcessor
  6. 谱聚类(Spectral clustering)(2):NCut
  7. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 数据库报错
  8. (11)Xamarin.iOS - 新增iPhone storyboard
  9. SQL Server 对比数据库差异
  10. RDIFramework.NET ━ 9.8 用户权限管理 ━ Web部分