Sé que un int es un tipo de valor, pero ¿qué son las matrices de tipos de valor? Tipos de referencia Tipos de valor? Quiero pasar una matriz a una función para verificar algo. ¿Debo pasar la matriz, ya que solo pasará la referencia de ella, o debería pasarla como referencia?
124
Respuestas:
https://msdn.microsoft.com/en-us/library/bb985948.aspx
fuente
La prueba más simple para el tipo de referencia frente al tipo de valor es que los tipos de referencia pueden ser
null
, pero los tipos de valores no.fuente
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 :
fuente
Primero quiero decirte que Array es un tipo de referencia. ¿Por qué? Les explico lanzar un ejemplo por aquí.
Ejemplo:
También los tipos de referencia pueden ser nulos, mientras que los tipos de valores no pueden.
tipo de valor almacenado en la pila y tipo de referencia almacenado en el montón
Puede pasar la matriz a la función usando o ref. Solo los métodos de inicialización son diferentes.
más..
fuente
Pruebe para verificar si es una referencia o un tipo de valor:
Puede probarlo en línea: https://dotnetfiddle.net/UWFP45
fuente
La matriz en sí es un tipo de referencia. Los valores de esa matriz son valores o tipos de referencia determinados 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.
Todos los arreglos unidimensionales implementan implícitamente
IList<T>
, donde<T>
está el tipo de datos del arreglo. En su lugar, puede usar esa interfaz como el tipo de datos de su parámetro de método. También podría usarIEnumerable<T>
para el tipo de datos. En cualquier caso (o incluso si solo lo usaint[]
) no debería necesitar pasarlo explícitamente comoref
parámetro.fuente
// La referencia a la matriz se pasa por valor. Esta es la fuente de la confusión :-) ...
fuente
Las matrices siempre son tipos de referencia. No importa que la matriz contenga un tipo de valor como int o un tipo de referencia como una cadena. Cuando declara la matriz, por ejemplo
int[] integers=new int[10]
;La variable entera en sí misma solo contiene referencias a la matriz que residirá en el montón.
También hay muchas personas que mencionan que podría diferir el tipo de valor del tipo de referencia, solo depende del hecho de que la variable podría ser nula o no. Me gustaría mencionar que en c # los tipos de valores actuales también pueden ser nulos
por ejemplo
y no es una buena manera de identificar que el tipo es referencia o valor solo depende de que la variable de hecho pueda ser nula o no.
fuente
Solo un poco de una idea:
Por ejemplo,
int
representa un solo entero,int[]
representa una matriz de enteros.Para inicializar la matriz con dimensiones específicas, puede usar la
new
palabra clave, dando el tamaño entre corchetes después del nombre del tipo: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
integers
matriz es un tipo de referencia. Entonces si luego escribes:esto simplemente asignará la copia variable completa para referirse a la misma matriz, no creará una nueva matriz.
La sintaxis de matriz de C # es flexible, le permite declarar matrices sin inicializarlas para que la matriz se pueda dimensionar dinámicamente más adelante en el programa. Con esta técnica, básicamente está creando una referencia nula y luego apuntando esa referencia a un tramo de ubicaciones de memoria asignadas dinámicamente solicitadas con una
new
palabra clave:Gracias.
fuente