English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tipos de valores y tipos de referencia de C#

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:

  1. Tipos de valor

  2. Tipos de referencia

  3. Tipos de puntero

Tipos de valor

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)

Asignación de memoria para variables de tipo valor

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

Transmitir variables de tipo valor

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

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.

Tipos de referencia

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.

Asignación de memoria de variables de tipo referencia

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

Transmitir variables de tipo referencia

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);
}
Salida:
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.

Valor nulo

  El valor predeterminado null de un tipo de referencia es cuando no se inicializa. Null representa no referenciar ningún objeto.

Tipo de referencia de referencia nula

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.