首页 > 代码库 > Int[]是引用类型还是值类型

Int[]是引用类型还是值类型

分析问题

  .NET所有数据都以类型的方式表示,数组也不例外。存储不同类型项目的数组都是一个类型,.NET会自动地为数组生成新的类型。例如下列申明:

DateTime[] times;

  CLR就会在运行时创建一个DateTime[]类型,所以数组类型可以说是一个类型族,而它们的共性就是所有的数组类型继承自System.Array,这种设计方式和委托非常类似,委托的概念将在后面的章节有所覆盖。System.Array实现了多个接口,并且直接继承自System.Object,从中可以得出结论:所有的数组类型都是引用类型。

  无论是存储值类型对象的数组,还是存储引用类型对象的数组,其本身类型都是引用类型,而它们的内存也就都是分配在堆上的。不同之处在于,存储值类型对象的数组,所有项目的值就已经包含在数组内,而存储引用类型对象的数组,它的项目也就是引用,具体的对象实例将位于堆上其他位置,或者根本还未分配。下图展示了两者内存的分配情况。

  .NET数组和传统C++中的数组是有区别的,最显著的一点差别就是在.NET中,任何数据类型的数组本身就是一个类型,而这个类型保证了数组使用的安全性。例如有过C++经验的程序员都遇到过数组越界的问题,而在.NET中这样的问题被彻底解决,CLR会检测所有对数组的访问,任何试图访问数组边界以外的代码都会产生一个IndexOutOfRangeException异常。

答案

  数组类型是一族类型,它们都继承自System.Array,而System.Array又继承自System.Object。所有的数组类型都是引用类型。