是int 引用types还是值types?
我知道一个int是一个值types,但什么是值types的数组? 引用types? 值types? 我想传递一个数组来检查一些东西。 我应该只是传递数组,因为它只是通过它的引用,或者我应该通过它参考?
数组是允许您将多个项目作为一个集合来处理的机制。 Microsoft®.NET公共语言运行时(CLR)支持一维数组,multidimensional array和锯齿形数组(数组数组)。 所有的数组types都是从System.Array派生的,它本身是从System.Object派生的。 这意味着所有数组总是引用types ,这些引用types在托pipe堆上分配,而您的应用程序的variables包含对数组的引用,而不是数组本身。
引用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[]
),你也不需要显式地将它作为ref
parameter 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];
谢谢。