English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En C#, se clasifican estos tipos de datos según la forma en que almacenan valores en la memoria. C# incluye las siguientes categorías de tipos de datos:
Tipos de valor
Tipos de referencia
Tipos de puntero
Si el tipo de datos almacena los valores de datos en su propio espacio de memoria, es un tipo de valor. Esto significa que las variables de estos tipos de datos contienen directamente valores.
Todos los tipos de valor se derivan deSystem.ValueTypeheredado, mientras queSystem.ValueTypede nuevo desdeSystem.Objectheredado.
Por ejemplo, la variable entera int i = 100;
El sistema asigna100 se almacena en el espacio de memoria asignado para la variable i. La siguiente imagen ilustra cómo se100 se almacena en la memoria de "i" (0x239110Un supuesto lugar en)
Todos los tipos de datos a continuación son de tipo valor:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
Cuando transmite una variable de tipo valor de un método a otro, el sistema crea una copia separada de la variable en el otro método. Si cambia el valor en un método, no afectará la variable en el otro método.
static void ChangeValue(int x) { x = 200; Console.WriteLine(x); } static void Main(string[] args) { int i = 100; Console.WriteLine(i); ChangeValue(i); Console.WriteLine(i); }
100
200
100
En el ejemplo anterior, incluso después de pasar el variable i del método Main () al método ChangeValue () y cambiar su valor, sigue siendo inmutable.
Diferente de los tipos de valor, los tipos de referencia no almacenan directamente su valor. En su lugar, almacenan la dirección de la ubicación donde se almacena el valor. En otras palabras, los tipos de referencia contienen un puntero hacia otro almacenamiento de datos que guarda la información.
Por ejemplo, la siguiente variable de cadena:
string s = "Hello World!!";
La siguiente imagen muestra cómo el sistema asigna memoria a la variable de cadena anterior.
Como se muestra en la imagen anterior, el sistema elige una ubicación aleatoria en la memoria para la variable s (0x803200). El valor de la variable s es 0x600000, esta es la dirección de memoria real del valor de datos. Por lo tanto, los tipos de referencia almacenan la dirección de la ubicación donde se almacena el valor real, no el valor en sí.
A continuación se muestra el tipo de datos de tipo referencia:
Cadena
Arreglo (incluso si sus elementos son de tipo valor)
Clase
Delegación
Cuando transmite una variable de tipo referencia de un método a otro, no crea una nueva copia; en su lugar, transmite la dirección de la variable. Por lo tanto, si cambia el valor de la variable en el método, también se reflejará en el método de llamada.
static void ChangeReferenceType(Student std2) { std2.StudentName = "Steve"; } static void Main(string[] args) { Student std1 = new Student(); std1.StudentName = "Bill"; ChangeReferenceType(std1); Console.WriteLine(std1.StudentName); }
Steve
En el ejemplo anterior, pasamos el objeto Student std1 Se transmite al método ChangeReferenceType(). Aquí, realmente transmite std1la dirección de memoria. Por lo tanto, cuando el método ChangeReferenceType() cambia StudentName, realmente está cambiando std1del nombre del estudiante del objeto, porque std1y std2Puntan a la misma dirección en la memoria.
El valor predeterminado null de un tipo de referencia es cuando no se inicializa. Null representa no referenciar ningún objeto.
Las variables de tipo valor no pueden ser null, porque almacenan valores en lugar de direcciones de memoria. C#2La versión .0 introdujo tipos nullable, que se puede usar para asignar null a variables de tipo valor o declarar variables de tipo valor sin asignarles un valor.