c#中值类型和引用类型的基础教程中值类型和引用类型的基础教程
前言前言
值类型和引用类型,是c#比较基础,也必须掌握的知识点,但是也不是那么轻易就能掌握,今天跟着老胡一起来看看吧。
典型类型典型类型
首先我们看看这两种不同的类型有哪些比较典型的代表。
典型值类型典型值类型
int, long, float, double等原始类型中表示数字的类型都是值类型,表示时间的datatime也是值类型,除此之外我们还可以通过
关键字struct自定义值类型。
典型引用类型典型引用类型
原始类型中,array, list, dictionary, queue, stack和string都是引用类型,除此之外我们通过关键字class自定义引用类型。
基类基类
c#中所有的类型都最终继承自Object,这是没有疑问的,但是这其中还有些微区别。
值类型基类值类型基类
对于值类型来说,除了最终继承自Object,还继承自ValueType,继承链如下
但是请不要误解,这里仅仅指的是值类型天然是ValueType,但是不代表值类型能够这么声明
struct Struct1 : ValueType
{
}
这样是会引起编译错误的,值类型不能继承任何其他类型,值类型只能实现接口,不能继承自其它类型。只有引用类型既可以
实现接口也能继承自其它类型。顺便说一下,还有一点比较重要的是,ValueType重写了Object基类的Equals方法和
GetHashCode方法,所以当使用Equals比较两个值类型的时候,系统会比较两个值类型的各个属性是否相等,再返回结果,
这就是所谓的相等性。与此相对,引用类型在使用Equals的时候,会在后台调用object.ReferenceEquals,换言之,引用类型
在比较相等性的时候会考虑同一性。
引用类型基类引用类型基类
对于引用类型就没有那么麻烦,引用类型不会继承自ValueType。引用类型可以继承其他类型。
在内存中的表现在内存中的表现
我们都知道,C#将内存分为了两部分,一个是Stack,另外一个是Managed Heap。一般来说,用于函数调用进栈,函数返回
出栈,用的是Stack,而当创造一个新的实例时,会根据创建的实例属于值类型还是引用类型决定使用Stack还是Managed
Heap。
值类型在内存中值类型在内存中