时间:2021-05-20
在刚参加工作面试时,我们经常会遇到有关值类型和引用类型的问题,你回答的怎么样直接影响你在别人心目中的印象,你回答的不好说明你对C#没有深入的了解学习,今天我带大家回顾下C#中的引用类型和值类型。CLR支持两种类型:引用类型和值类型。虽然FCL中大多数类型都是引用类型但程序中用的最多的还是值类型。引用类型总是从托管堆上分配的,C#的new操作会返回对象的内存地址--也就是指向对象的数据的内存地址。设想假设每次使用一个Int32值时,都进行一次内存分配,性能会受到多大的影响,为了提升简单、常用的类型的性能,CLR提供了名为“值类型”的轻量级类型。值类型的实例一般在线程栈上分配。在代表值类型实例的一个变量中,并不包含一个指向实例的指针。相反,变量中包含了实例本身的字段。值类型的实例不受垃圾回收器的控制。因此,值类型的使用缓解了托管堆中的压力,并减少了一个应用程序在其生命周期需要进行的垃圾回收次数。.net framework SDK文档清楚地指出哪些类型是引用类型,哪些是值类型。任何称为“类”的类型都是引用类型,例如,System.Exception 类、System.IO.FileStream 类以及System.Random类都是引用类型。相反文档将所有的值类型称为结构或枚举。例如, System.In32结构、System.Boolean结构、System.Decimal结构、System.DayOfWeek枚举以及System.Drawing.FontStyle枚举都是值类型。所有的结构都是抽象类型System.ValueType的直接派生类。System.ValueType本身又是System.Object派生的,所有的值类型都必须从System.ValueType派生。所有的枚举都是从System.Enum抽象类型派生,后者又是从System.ValueType派生的。
以下代码演示了引用类型和值类型。
复制代码 代码如下:
//引用类型(由于使用了‘Class')
class SomeRef{public Int32 x;}
//值类型(由于使用了‘Struct')
struct SomeVal{public Int32 x;}
static void ValueTypeDemo(){
SomeRef r1 = new SomeRef(); //在堆上分配
SomeVal v1 = new SomeVal(); //在栈上分配
r1.x = 5; //提领指针
v1.x = 5; //在栈上修改
Console.WriteLine(r1.x); //显示“5”
Console.WriteLine(v1.x); //同样显示“5”
SomeRef r2 = r1; //只复制引用(指针)
SomeVal v2 = v1; //在栈上分配并复制成员
r1.x = 8; //r1.x和r2.x都会更改
v1.x = 9; //v1.x会更改,但v2.x不变
Console.WriteLine(r1.x); //显示“8”
Console.WriteLine(r2.x); //显示“8”
Console.WriteLine(v1.x); //显示“9”
Console.WriteLine(v2.x); //显示“5”
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文以一个简单实例讲述了C#装箱和拆箱操作的实现方法,简单来说装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型,是涉及栈和堆的使用方面的东西,学过C#
一、基本概念C#只有两种数据类型:值类型和引用类型值类型在线程栈分配空间,引用类型在托管堆分配空间值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱以下是
扩展阅读c#基础系列1---深入理解值类型和引用类型c#基础系列2---深入理解String引言在上篇文章深入理解值类型和引用类型的时候,有的小伙伴就推荐说一说
上篇文章给大家介绍了浅析C#中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c#泛型类型,说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我
我们继续自学C#编程教程,在上一课中介绍了C#的基本数据类型以及变量,今天这一节课我们来介绍值类型与引用类型!一、什么是值类型与引用类型?C#与大多数面向对象语