马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

C#值类型和引用类型的关系及区别

  [复制链接]
查看6280 | 回复9 | 2016-6-27 09:42:11 | 显示全部楼层 |阅读模式

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


C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2016-6-27 09:42:22 | 显示全部楼层
1
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
Amy尾巴 | 2016-6-27 09:47:54 | 显示全部楼层
66666
ibcadmin | 2016-6-27 09:52:55 | 显示全部楼层

几百年来第一个看公开教程评论的人..
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
ibcadmin | 2016-6-27 09:52:56 | 显示全部楼层

几百年来第一个看公开教程评论的人..

点评

我每次回复不是公开的啊  详情 回复 发表于 2016-6-27 09:58
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
剑弑 | 2016-6-27 09:58:12 | 显示全部楼层
ibcadmin 发表于 2016-6-27 09:52
几百年来第一个看公开教程评论的人..

我每次回复不是公开的啊
ibcadmin | 2016-6-27 14:20:55 | 显示全部楼层
剑弑 发表于 2016-6-27 09:58
我每次回复不是公开的啊

对不起 ...
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
剑弑 | 2016-6-28 09:01:47 | 显示全部楼层
Amy尾巴 | 2016-6-28 10:09:56 | 显示全部楼层
ibcadmin 发表于 2016-6-27 09:52
几百年来第一个看公开教程评论的人..

险些以为我是第一个吃螃蟹不吃腿的人
yo年耳贵hwm | 2016-8-29 20:34:09 | 显示全部楼层
祝楼主快乐,大家一齐讨论!
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则