¿Es int un tipo de referencia o un tipo de valor?

Sé que int es un tipo de valor, pero ¿qué son las matrices de tipos de valores? ¿Tipos de referencia? Tipos de valor? Quiero pasar una matriz a una función para verificar algo. ¿Debería pasar el conjunto, ya que solo pasará la referencia del mismo, o debería pasarlo como ref?

Las matrices son mecanismos que le permiten tratar varios elementos como una sola colección. El Common Language Runtime (CLR) de Microsoft® .NET admite matrices unidimensionales, matrices multidimensionales y matrices dentadas (matrices de matrices). Todos los tipos de matriz se derivan implícitamente de System.Array, que a su vez se deriva de System.Object. Esto significa que todas las matrices son siempre tipos de referencia que se asignan en el almacenamiento dynamic administrado, y la variable de la aplicación contiene una referencia a la matriz y no la matriz en sí.

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

La prueba más sencilla para el tipo de referencia frente al tipo de valor es que los tipos de referencia pueden ser null , pero los tipos de valor no.

Las matrices (incluso de tipos de valor como int) son tipos de referencia en C #.

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

En C #, las matrices son en realidad objetos. System.Array es el tipo base abstracto de todos los tipos de matriz.

Primero quiero decirte que Array es un tipo de referencia. ¿Por qué? Explico arroje un ejemplo aquí.

Ejemplo:

 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. 

También los tipos de referencia pueden ser nulos, mientras que los tipos de valores no pueden.

tipo de valor almacenado en Stack y tipo de referencia almacenado en Heap

Puede pasar array para funcionar usando out o ref. Solo los métodos de inicialización son diferentes.

Más..

La matriz en sí es un tipo de referencia. Los valores de esa matriz son valores o tipos de referencia según lo determinado por el tipo de datos de la matriz. En su ejemplo, la matriz es un tipo de referencia y los valores son tipos de valores.

Todas las matrices de una sola dimensión implícitamente implementan IList , donde es el tipo de datos de la matriz. En su lugar, puede usar esa interfaz como el tipo de datos de su parámetro de método. También puede usar IEnumerable para el tipo de datos. En cualquier caso (o incluso si solo usa int[] ) no debería necesitar pasarlo explícitamente como un parámetro ref .

Prueba para verificar si es un tipo de referencia o valor:

 // 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! //************************** 

Puede probarlo en línea: https://dotnetfiddle.net/UWFP45

// La referencia a la matriz se pasa por valor. Esta es la fuente de la confusión 🙂 …

  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); } 

Las matrices siempre son tipos de referencia. No importa que array contenga tipo de valor como int o tipo de referencia como string. Cuando declaras una matriz, por ejemplo

int[] integers=new int[10] ;

la variable de enteros en sí contiene solo referencia a la matriz que residirá en el montón.

También hay muchas personas que mencionan que usted puede diferir el tipo de valor del tipo de referencia simplemente depende del hecho de que esa variable podría ser nula o no. Me gustaría mencionar que en el c # actualmente los tipos de valores también pueden ser nulos

por ejemplo

 int? integer=null 

y no es una buena manera de identificar el tipo, la referencia o el valor solo depende de que la variable de hecho sea nula o no.

Solo un poco de una idea:

Por ejemplo, int representa un entero único, int[] representa una matriz de números enteros.

Para inicializar la matriz con dimensiones específicas, puede usar la palabra clave new , que da el tamaño entre corchetes después del nombre del tipo:

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

Todas las matrices son tipos de referencia y siguen la semántica de referencia. Por lo tanto, en este código, aunque los elementos individuales son tipos de valores primitivos, la matriz de integers es un tipo de referencia. Entonces, si luego escribes:

 int[] copy = integers; 

esto simplemente asignará la copia de variable completa para referirse a la misma matriz, no creará una nueva matriz.

La syntax de matriz de C # es flexible, le permite declarar matrices sin inicializarlas para que la matriz pueda ser dimensionada dinámicamente más adelante en el progtwig. Con esta técnica, básicamente está creando una referencia nula y luego apuntando esa referencia en un tramo de ubicaciones de memoria dinámicamente asignadas solicitadas con una new palabra clave:

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

Gracias.