Clasificación de tipos de valor y tipos de referencia
Tipos integrados predefinidos
| Categoría | Tipos incluidos |
|---|---|
| Tipos de valor (numéricos básicos / booleanos / caracteres) | Enteros con signo: sbyte, short, int, longEnteros sin signo: byte, ushort, uint, ulongPunto flotante / alta precisión: float, double, decimalBooleano: boolCarácter: char |
| Tipos de referencia (referencias integradas) | object (clase base de todos los tipos), string, dynamic |
Tipos definidos por el usuario
| Categoría | Tipos |
|---|---|
| Tipos de valor | struct (estructura), enum (enumeración) |
| Tipos de referencia | class, interface, delegate, array (matriz) |
Como comentamos en la clase anterior, los datos de los tipos de referencia se almacenan obligatoriamente en el montículo. En cambio, los datos de los tipos de valor pueden residir tanto en el montículo como en la pila.
La parte de referencia de un tipo de referencia puede guardarse en el montículo o en la pila.
Si una variable de tipo valor o la referencia de un tipo de referencia se almacena en montículo o pila depende de si se trata de un miembro de un tipo o una variable local dentro de una función.
Cuatro tipos de variables
| Tipo de variable | Definición y propósito |
|---|---|
| Variable local Local variable | Datos temporales dentro de un método, no es miembro de un tipo; Almacenada en la pila Sin inicialización automática |
| Campo Field | Dato vinculado a clase / estructura, pertenece a los miembros del tipo; Los campos de clase se guardan en el montículo Los campos de estructura siguen la ubicación de la estructura; Inicialización automática |
| Parámetro Parameter | Variable temporal para argumentos de método, no es miembro de un tipo; Almacenado en la pila Sin inicialización automática |
| Elemento de matriz Array element | Dato individual dentro de una matriz; Todos alojados en el montículo Inicialización automática |
La inicialización automática significa que el compilador asigna un valor por defecto a la variable aunque el programador no establezca un valor inicial.
Resumen más sencillo
| Tipo de variable | Ubicación de almacenamiento | Inicialización automática |
|---|---|---|
| Variable local | Pila / Pila + Montículo | No |
| Campo de clase | Montículo | Sí |
| Campo de estructura | Pila / Montículo | Sí |
| Parámetro de método | Pila | No |
| Elemento de matriz | Montículo | Sí |

Declaración de variables
Sintaxis: Tipo NombreVariable;
int var2;
Esta línea declara una variable y cumple dos tareas principales:
- Indica al compilador que var2 es una variable de tipo int con nombre var2.
- El compilador reserva espacio de memoria. Si se asigna al montículo o a la pila depende del contexto: si es variable local, parámetro, campo, etc.

Inicializador de variables (Initializer)
Sintaxis: Tipo NombreVariable = ValorInicial;
Ejemplo: int var2 = 17;
El inicializador es una utilidad del compilador para preparar variables. Algunas variables deben ser inicializadas explícitamente en el código por el desarrollador; otras pueden delegar esta tarea al inicializador.
Las variables locales sin inicializar tienen valor indefinido, generan error de compilación y no se pueden usar directamente;
Las variables con inicialización automática como campos y elementos de matriz reciben valores predeterminados: los tipos numéricos valen 0, los tipos de referencia valen null.
Consulte este ejemplo:
class Program
{
static void Main(string[] args)
{
int times = 100;
Person person = new Person();
}
}
class Person
{
public int age;
}
Lenguaje del código: JavaScript (javascript)
Este ejemplo sencillo define dentro de Main una variable de tipo valor times y una variable de tipo referencia person. El tipo referencia contiene un campo age.
No asignamos valor inicial a age, mientras que establecemos manualmente el valor de times.
El código compila correctamente.

Si eliminamos el valor inicial 100 de times y lo escribimos así:

Aparece inmediatamente una línea ondulada roja bajo la variable y falla la compilación.
Si forzamos la compilación, se mostrarán mensajes de error

La ventana de lista de errores muestra los detalles

Aviso: El error solo aparece si usamos la variable times en el código. Si nunca se invoca, no habrá error y se podrá compilar.
class Program
{
static void Main(string[] args)
{
int times;
Person person = new Person();
}
}
Lenguaje del código: JavaScript (javascript)
En cambio, los campos dentro de un tipo, como age en la clase Person inferior, permiten compilar y ejecutar sin valor inicial explícito.
class Program
{
static void Main(string[] args)
{
int times = 100;
Console.WriteLine(times);
Person person = new Person();
Console.WriteLine(person.age);
}
}
class Person
{
public int age;
}
Lenguaje del código: JavaScript (javascript)

Veremos que se imprime 0. Como campo miembro de clase sin inicialización manual, el inicializador le asigna un valor por defecto. El valor por defecto de int es 0; cada tipo tiene su propio valor predeterminado.
Declaración de múltiples variables en una misma línea
- En una sola línea solo se pueden declarar variables del mismo tipo;
- Los nombres se separan con coma; se pueden mezclar variables inicializadas y sin inicializar;
- Está prohibido mezclar varios tipos de datos en una línea.
// Válido
int var3 = 7, var4, var5 = 3;
double var6, var7 = 6.52;
// Inválido! Mezcla int y float
int var8, float var9;
Lenguaje del código: JavaScript (javascript)
Utilizar el valor de una variable
Basta escribir el nombre de la variable para leer el valor almacenado en memoria:
Console.WriteLine("{0}", var2);Lenguaje del código: JavaScript (javascript)

Variable