是int 引用types还是值types?

我知道一个int是一个值types,但什么是值types的数组? 引用types? 值types? 我想传递一个数组来检查一些东西。 我应该只是传递数组,因为它只是通过它的引用,或者我应该通过它参考?

数组是允许您将多个项目作为一个集合来处理的机制。 Microsoft®.NET公共语言运行时(CLR)支持一维数组,multidimensional array和锯齿形数组(数组数组)。 所有的数组types都是从System.Array派生的,它本身是从System.Object派生的。 这意味着所有数组总是引用types ,这些引用types在托pipe堆上分配,而您的应用程序的variables包含对数组的引用,而不是数组本身。

https://msdn.microsoft.com/en-us/library/bb985948.aspx

引用types与值types最简单的testing是引用types可以为null ,但值types不能。

数组(甚至像int这样的值types)是C#中的引用types。

http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx :

在C#中,数组实际上是对象。 System.Array是所有数组types的抽象基types。

首先我想告诉你,Array是一个引用types。 为什么? 我在这里解释一个例子。

例:

 int val = 0; // this is a value type ok int[] val1 = new int[20] // this is a reference type because space required to store 20 integer value that make array allocated on the heap. 

引用types也可以为null,而值types不能。

存储在堆栈中的值types和存储在堆中的引用types

你可以使用out或ref来传递数组。 只有初始化方法是不同的。

更多..

数组本身是一个引用types。 该数组的值是由数组数据types确定的值或引用types。 在你的例子中,数组是一个引用types,值是值types。

所有单维数组隐式实现IList<T> ,其中<T>是数组的数据types。 您可以将该接口用作方法参数的数据types。 您也可以使用IEnumerable<T>作为数据types。 在这两种情况下(或者即使你只是使用int[] ),你也不需要显式地将它作为refparameter passing。

testing以validation它是否是引用或值types:

 // we create a simple array of int var a1 = new int[]{1,2,3}; // copy the array a1 to a2 var a2 = a1; // modify the first element of a1 a1[0]=2; // output the first element of a1 and a2 Console.WriteLine("a1:"+a1[0]); // 2 Console.WriteLine("a2:"+a2[0]); // 2 //************************** // all the two variable point to the same array // it's reference type! //************************** 

您可以在线testing它: https : //dotnetfiddle.net/UWFP45

//对数组的引用是按值传递的。 这是混乱的来源:-) …

  int[] test = { 1, 2, 3, 4 }; modifContenuSansRef(test); Console.WriteLine(test[0]); // OK --> 99 le contenu du tableau est modifié modifTailleSansRef(test); Console.WriteLine(test.Length); // KO --> 4 La taille n'est pas modifiée } static void modifContenuSansRef(int[] t) { t[0] = 99; } static void modifTailleSansRef(int[] t) { Array.Resize(ref t, 8); } 

数组总是引用types。不要紧,数组会包含像int这样的值types或像string这样的引用types。当你声明数组时

int[] integers=new int[10] ;

整数variables本身仅包含对驻留在堆中的数组的引用。

还有很多人提到,你可以从引用types的值types不同,只是取决于variables可能是空的事实。 我想提一下,在c#中当前的值types也可以为null

例如

 int? integer=null 

并不是很好的方式来确定types是引用或值只取决于事实variables可以为null或不。

只是有点洞察力:

例如, int表示一个整数, int[]表示一个整数数组。

要使用特定维度初始化数组,可以使用new关键字,在types名称后面的方括号中给出大小:

 //create a new array of 32 ints. int[] integers = new int[32]; 

所有数组都是引用types,并遵循引用语义。 因此,在这个代码中,即使单个元素是原始值types, integers数组也是一个引用types。 所以如果你以后写:

 int[] copy = integers; 

这将简单地分配整个variables副本引用相同的数组,它不会创build一个新的数组。

C#的数组语法是灵活的,它允许你声明数组而不用初始化它们,这样数组可以在程序的后面dynamicresize。 使用这种技术,你基本上是创build一个空引用,然后用一个new关键字指向一个dynamic分配的内存位置的引用:

 int[] integers; integers = new int[32]; 

谢谢。