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#中值类型和引用类型的区别
来源:这里教程网
时间:2026-02-21 15:18:02
作者:
编辑推荐:
- 比较C#中值类型和引用类型的区别02-21
- 传播智客ASP.NET中级系列视频视频资料02-21
- 介绍C#中的堆和栈02-21
- 传播智客ASP.NET基础系列视频资料分享02-21
- 极客学院C#视频教程的资料推荐02-21
- 有关ASP.NET Core 中的多语言支持的详细介绍02-21
- 关于C#视频教程的资源分享02-21
- 极客学院ASP.NET视频教程的资料推荐02-21
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 传播智客ASP.NET中级系列视频视频资料
传播智客ASP.NET中级系列视频视频资料
26-02-21 - 传播智客ASP.NET基础系列视频资料分享
传播智客ASP.NET基础系列视频资料分享
26-02-21 - 极客学院C#视频教程的资料推荐
极客学院C#视频教程的资料推荐
26-02-21 - 有关ASP.NET Core 中的多语言支持的详细介绍
有关ASP.NET Core 中的多语言支持的详细介绍
26-02-21 - 关于C#视频教程的资源分享
关于C#视频教程的资源分享
26-02-21 - 极客学院ASP.NET视频教程的资料推荐
极客学院ASP.NET视频教程的资料推荐
26-02-21 - 关于ASP.NET视频教程的资源分享
关于ASP.NET视频教程的资源分享
26-02-21 - 详解有关asp.net mvc 动态编译生成Controller的方法
详解有关asp.net mvc 动态编译生成Controller的方法
26-02-21 - web.config 配置文件示例详解
web.config 配置文件示例详解
26-02-21 - asp.net教程之sql server转换成oracle的方法详解
asp.net教程之sql server转换成oracle的方法详解
26-02-21
