龙空技术网

.NET 值类型和引用类型详解释

人在江湖 79

前言:

如今兄弟们对“net类型a”都比较重视,朋友们都需要了解一些“net类型a”的相关资讯。那么小编也在网上网罗了一些关于“net类型a””的相关文章,希望你们能喜欢,小伙伴们一起来了解一下吧!

C#中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type)。值类型和引用类型是以它们在计算机内存中是如何被分配的来划分的。值类型包括了结构和枚举,引用类型则包括了类、接口、委托等。还有一种特殊的值类型,称为简单类型(Simple Type),比如byte,int等,这些简单类型实际上是BCL基类库类型的别名。比如,声明一个int类型,实际上是声明一个System.Int32结构类型。因此,在Int32类型中定义的方法或属性,都可以在int类型上调用。

所有的值类型都隐式地继承自System.ValueType类型(注意System.ValueType本身是一个类类型)。之所以说是“隐式地”,是因为在C#代码中,是看不到这个继承关系的,这个关系只有通过MSIL代码才可以看到。System.ValueType类型和所有的引用类型都继承自System.Object基类。

C#不支持多重继承,因为结构已经隐式地继承自ValueType,所以结构不支持继承。

栈(stack)是一种后进先出的数据结构,在内存中,变量会被分配在栈上来进行操作。

堆(heap)是用于为引用类型的实例(对象)分配空间的内存区域,在堆上创建一个对象,会将对象的地址传给栈上的变量(反过来叫变量指向此对象,或者变量引用此对象)。

值类型变量

值类型变量

类型变量

引用类型

当声明一个引用类型变量,并使用new操作符创建引用类型实例的时候,该引用类型的变量会被分配到线程栈上,变量保存了位于堆上的引用类型的实例的内存地址。变量本身不包含任何类型所定义的数据。如果仅仅声明一个变量,但不使用new操作符,由于在堆上还没有创建类型的实例,因此,变量值为null,意思是不指向任何对象(堆上的对象的实例)。

对于变量的类型声明,用于限制此变量可以保存的类型实例的地址。

说明

这里有一些概念容易混淆,那就是变量(Variable)、对象(Object)、实例(Instance)。

变量可以是一个值类型,也可以是一个引用类型。当变量是引用类型时,由于本身只包含实际对象的引用(内存地址),因此也叫做对象引用。而在堆上创建的对象,称为对象的实例(根据类的定义分配了内存)。从一段简单的代码也可以看出来,如果运行Object a=null;Console.WriteLine(a.ToString();,会得到运行时错误“未将对象引用设置到对象的实例”。此时变量a是一个对象引用,因为没有使用new操作符,所以它没有指向任何的对象实例。

引用类型声明

创建一个对象

则会完成下面几件事:

1、在应用程序堆(Heap)上创建一个引用类型(ReferenceType)对象的实例,并为它分配内存地址。

2、自动传递该实例的引用给构造函数。(正因为如此,才可以在构造函数中使用this来访问这个实例。)

3、调用该类型的构造函数。

4、返回该实例的引用(内存地址),赋值给rPointl变量,如图1-3所示。

引用类型的对象引用和对象实例

标签: #net类型a