Capítulo 3: Variables y tipos de datos en C#
7 min de lectura
Parte I - Sección 1: Fundamentos de C# - Nivel: Principiante
Objetivos de aprendizaje
Al finalizar este capítulo serás capaz de:
- Entender qué es una variable y por qué las necesitamos en programación
- Declarar y usar los tipos de datos básicos en C# (string, int, double, bool)
- Aplicar convenciones de nombres correctas para variables
- Realizar conversiones entre diferentes tipos de datos
- Calcular valores de circuitos eléctricos usando variables
Requisitos previos
Antes de comenzar este capítulo debes:
- Haber completado el Capítulo 2
- Tener tu entorno de scripts configurado
- Poder ejecutar scripts en EPLAN
Proyecto del capítulo
Calculadora de Circuitos Básicos
Al final de este capítulo habrás construido un script que calcula:
- Resistencia total en serie
- Voltaje usando Ley de Ohm
- Potencia de un circuito
- Conversiones de unidades eléctricas
Tiempo estimado: 30-40 minutos
Contenido
1. Introducción: ¿Qué es una variable?
Imagina que estás diseñando un circuito y necesitas anotar varios valores:
- Voltaje de entrada: 230V
- Corriente: 16A
- Factor de potencia: 0.85
En papel, escribirías estos valores en algún lugar. En programación, las variables son contenedores con nombre donde guardamos valores.
Analogía con la ingeniería
Piensa en las variables como puntos de medición etiquetados en un esquema:
[230V] ----[R1]----[R2]---- [GND]
↑ ↑ ↑
voltaje res1 res2
Cada punto tiene un nombre (voltaje, res1, res2) y un valor (230, 100, 220).
En C#, esto sería:
double voltaje = 230.0;
double res1 = 100.0;
double res2 = 220.0;
2. Tipos de datos básicos en C#
C# es un lenguaje fuertemente tipado. Esto significa que cada variable tiene un tipo específico que define:
- Qué tipo de información puede almacenar
- Cuánta memoria ocupa
- Qué operaciones puedes hacer con ella
Los 4 tipos básicos que usarás constantemente son:
2.1 string - Texto
Uso: Para almacenar palabras, frases, nombres, descripciones.
string proyecto = "Armario Principal";
string cliente = "Industrias XYZ";
string ubicacion = "Planta 2 - Sección A";
Características:
- Se declara con comillas dobles:
"texto" - Puede contener cualquier carácter (letras, números, símbolos)
- Inmutable (no puedes modificar caracteres individuales directamente)
Ejemplos prácticos en EPLAN:
string nombreProyecto = "P-2025-001";
string designacion = "Q1";
string fabricante = "Siemens";
string descripcion = "Contactor principal 3P 65A";
2.2 int - Números enteros
Uso: Para cantidades completas sin decimales.
int numeroPages = 45;
int cantidadBornes = 120;
int año = 2025;
Características:
- Solo números enteros: -2147483648 a 2147483647
- Sin decimales
- Operaciones matemáticas: +, -, *, /, %
Ejemplos prácticos en EPLAN:
int numeroPagina = 15;
int cantidadCables = 247;
int numeroCircuito = 3;
int potenciaNominal = 400; // Watts como número entero
Caso típico: Contar elementos
int totalContactores = 12;
int contactoresUsados = 8;
int contactoresDisponibles = totalContactores - contactoresUsados; // 4
2.3 double - Números decimales
Uso: Para valores con decimales (mediciones eléctricas, cálculos precisos).
double voltaje = 230.5;
double corriente = 16.3;
double resistencia = 10.75;
Características:
- Números con decimales
- Precisión de ~15-17 dígitos decimales
- Se usa punto (.) como separador decimal (no coma)
Ejemplos prácticos en EPLAN:
double voltajeLinea = 400.0;
double corrienteNominal = 16.5;
double factorPotencia = 0.92;
double seccionCable = 2.5; // mm²
double longitudCable = 47.8; // metros
Caso típico: Ley de Ohm
double voltaje = 230.0; // V
double corriente = 10.5; // A
double resistencia = voltaje / corriente; // 21.90476... Ω
Nota importante: Siempre usa .0 aunque sea número entero para que C# lo trate como double:
double valor1 = 100.0; // Correcto
double valor2 = 100; // También funciona, pero menos claro
2.4 bool - Valores lógicos (verdadero/falso)
Uso: Para condiciones, estados, banderas.
bool proyectoAbierto = true;
bool tieneErrores = false;
bool esEmergencia = true;
Características:
- Solo dos valores posibles:
trueofalse - Fundamental para tomar decisiones (lo veremos en Capítulo 5)
- No se escribe entre comillas
Ejemplos prácticos en EPLAN:
bool proyectoModificado = true;
bool exportacionExitosa = false;
bool requiereAprobacion = true;
bool esTrifasico = true;
bool tieneProteccionDiferencial = false;
Caso típico: Estados del proyecto
bool proyectoGuardado = false;
bool cambiosPendientes = true;
bool backupRealizado = true;
3. Declaración y asignación de variables
3.1 Declaración básica
La sintaxis básica es:
tipo nombreVariable = valor;
Ejemplos:
string modelo = "3RT2026-1BB40";
int cantidad = 5;
double precio = 127.50;
bool disponible = true;
3.2 Declaración sin valor inicial
Puedes declarar una variable sin darle valor inmediatamente:
string nombreCliente;
int numeroPedido;
double precioTotal;
// Más adelante en el código...
nombreCliente = "Acme Corp";
numeroPedido = 1001;
precioTotal = 1250.75;
Importante: Si intentas usar una variable sin asignarle valor, C# dará error:
int cantidad;
int total = cantidad * 2; // ERROR: "Use of unassigned local variable 'cantidad'"
3.3 Múltiples variables del mismo tipo
Puedes declarar varias variables del mismo tipo en una línea:
double voltajeL1, voltajeL2, voltajeL3;
voltajeL1 = 230.0;
voltajeL2 = 232.5;
voltajeL3 = 229.8;
O con valores iniciales:
double voltajeL1 = 230.0, voltajeL2 = 232.5, voltajeL3 = 229.8;
Aunque para legibilidad, generalmente preferimos:
double voltajeL1 = 230.0;
double voltajeL2 = 232.5;
double voltajeL3 = 229.8;
4. Convenciones de nombres (Naming conventions)
Seguir convenciones de nombres hace tu código más legible y profesional.
4.1 Reglas obligatorias (el código no compilará si no las sigues)
- Solo letras, números y guión bajo (_)
int valor1; // OK int valor_uno; // OK int valor-uno; // ERROR: no se permiten guiones int valor uno; // ERROR: no se permiten espacios - Debe comenzar con letra o guión bajo
int numero; // OK int _temporal; // OK int 1numero; // ERROR: no puede empezar con número - No puede ser una palabra reservada de C#
int numero; // OK int int; // ERROR: 'int' es palabra reservada int string; // ERROR: 'string' es palabra reservada
4.2 Convenciones recomendadas (estilo camelCase para variables)
En C#, las variables locales usan camelCase: primera palabra en minúscula, siguientes palabras con mayúscula inicial.
// Bien (camelCase)
string nombreProyecto;
int numeroPagina;
double voltajeNominal;
bool esCircuitoEmergencia;
// Mal (otros estilos)
string NombreProyecto; // PascalCase (se usa para clases, no variables)
string nombre_proyecto; // snake_case (común en Python, no en C#)
string nombreproyecto; // Difícil de leer
4.3 Nombres descriptivos
Usa nombres que expliquen qué contiene la variable:
// Mal: nombres genéricos
string s;
int n;
double x;
// Bien: nombres descriptivos
string nombreCliente;
int cantidadContactores;
double seccionCable;
Para ingenieros eléctricos, incluye la unidad cuando sea relevante:
double voltajeV; // Voltaje en Voltios
double corrienteA; // Corriente en Amperios
double resistenciaOhm; // Resistencia en Ohmios
double longitudMetros; // Longitud en metros
double seccionMM2; // Sección en mm²
O mejor aún, usa nombres claros sin abreviar:
double voltajeLinea;
double corrienteNominal;
double resistenciaTotal;
double longitudCable;
double seccionCable;
5. Conversiones de tipos (Type casting)
A veces necesitas convertir un valor de un tipo a otro.
5.1 Conversión implícita (automática)
C# convierte automáticamente cuando no hay riesgo de perder información:
int numeroPaginas = 10;
double numeroDecimal = numeroPaginas; // int → double (OK automático)
// numeroDecimal ahora vale 10.0
Jerarquía de conversión implícita:
int → long → float → double
5.2 Conversión explícita (casting)
Cuando vas de un tipo "más grande" a uno "más pequeño", necesitas casting explícito:
double voltajeDecimal = 230.7;
int voltajeEntero = (int)voltajeDecimal; // double → int
// voltajeEntero = 230 (se trunca el decimal)
Sintaxis: (tipoDestino)variable
Cuidado: Se pierde la parte decimal
double precio = 127.89;
int precioEntero = (int)precio; // precioEntero = 127 (no 128!)
5.3 Conversión usando métodos Convert
Para conversiones más seguras y controladas:
// De string a números
string textoVoltaje = "230";
int voltaje = Convert.ToInt32(textoVoltaje);
string textoCorriente = "16.5";
double corriente = Convert.ToDouble(textoCorriente);
// De números a string
int cantidad = 42;
string textoAntidad = Convert.ToString(cantidad);
// o más simple:
string textoCantidad2 = cantidad.ToString();
Conversiones comunes:
// String → números
int numero = Convert.ToInt32("123");
double decimal = Convert.ToDouble("45.67");
bool estado = Convert.ToBoolean("true");
// Números → string
string texto1 = Convert.ToString(230);
string texto2 = (16.5).ToString();
string texto3 = true.ToString(); // "True"
5.4 Parse y TryParse
Para convertir strings a números, también puedes usar:
// Parse (genera error si falla)
string texto = "230";
int voltaje = int.Parse(texto);
// TryParse (devuelve true/false si funcionó)
string textoEntrada = "230";
int voltajeResultado;
bool exito = int.TryParse(textoEntrada, out voltajeResultado);
if (exito)
{
// voltajeResultado contiene 230
}
else
{
// La conversión falló
}
6. Operaciones básicas con variables
6.1 Operaciones aritméticas
double voltaje = 230.0;
double corriente = 10.5;
// Suma
double suma = voltaje + corriente; // 240.5
// Resta
double diferencia = voltaje - corriente; // 219.5
// Multiplicación
double potencia = voltaje * corriente; // 2415.0 W
// División
double resistencia = voltaje / corriente; // 21.904... Ω
// Módulo (resto de división)
int totalCables = 100;
int cablesPorBandeja = 12;
int sobran = totalCables % cablesPorBandeja; // 4
Importante con división de enteros:
int dividendo = 10;
int divisor = 3;
int resultadoEntero = dividendo / divisor; // 3 (no 3.33!)
double resultadoCorrecto = (double)dividendo / divisor; // 3.333...
6.2 Concatenación de strings
Unir textos con el operador +:
string nombre = "Motor";
string numero = "M1";
string completo = nombre + " " + numero; // "Motor M1"
Combinar strings y números:
int cantidad = 5;
string mensaje = "Se encontraron " + cantidad + " errores";
// "Se encontraron 5 errores"
6.3 Formato con string.Format
Para construir strings más complejos:
string cliente = "Acme Corp";
int cantidad = 15;
double precio = 127.50;
string mensaje = string.Format(
"Cliente: {0}\nCantidad: {1}\nPrecio: ${2:F2}",
cliente,
cantidad,
precio
);
// Resultado:
// Cliente: Acme Corp
// Cantidad: 15
// Precio: $127.50
Placeholders:
{0},{1},{2}: posición del argumento:F2: formato con 2 decimales\n: salto de línea
Manos a la obra: Construyendo el proyecto
Vamos a crear un script que realiza cálculos eléctricos básicos usando variables.
Paso 1: Estructura básica
using System;
using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
public class CalculadoraCircuitos
{
[Start]
public void Ejecutar()
{
// Aquí irá nuestro código
}
}
Paso 2: Declarar variables para un circuito simple
[Start]
public void Ejecutar()
{
// Datos del circuito
double voltaje = 230.0; // Voltios
double corriente = 16.0; // Amperios
double factorPotencia = 0.85;
string nombreCircuito = "Circuito de Iluminación Planta 2";
bool esTrifasico = false;
}
¿Qué acabamos de hacer? Declaramos las variables necesarias para un circuito eléctrico básico.
Paso 3: Calcular resistencia (Ley de Ohm)
[Start]
public void Ejecutar()
{
// Datos del circuito
double voltaje = 230.0;
double corriente = 16.0;
double factorPotencia = 0.85;
string nombreCircuito = "Circuito de Iluminación Planta 2";
bool esTrifasico = false;
// Cálculo 1: Resistencia (R = V / I)
double resistencia = voltaje / corriente;
}
¿Qué acabamos de hacer? Aplicamos la Ley de Ohm para calcular la resistencia del circuito.
Paso 4: Calcular potencia
// Cálculo 2: Potencia aparente (S = V * I)
double potenciaAparente = voltaje * corriente;
// Cálculo 3: Potencia activa (P = V * I * cos φ)
double potenciaActiva = voltaje * corriente * factorPotencia;
¿Qué acabamos de hacer? Calculamos la potencia aparente y la potencia activa considerando el factor de potencia.
Paso 5: Construir mensaje con resultados
// Construir el mensaje con formato
string mensaje = string.Format(
"=== CALCULADORA DE CIRCUITOS ===\n\n" +
"Circuito: {0}\n" +
"Tipo: {1}\n\n" +
"DATOS DE ENTRADA:\n" +
"Voltaje: {2:F1} V\n" +
"Corriente: {3:F1} A\n" +
"Factor de potencia: {4:F2}\n\n" +
"RESULTADOS CALCULADOS:\n" +
"Resistencia: {5:F2} Ω\n" +
"Potencia aparente: {6:F2} VA\n" +
"Potencia activa: {7:F2} W",
nombreCircuito,
esTrifasico ? "Trifásico" : "Monofásico",
voltaje,
corriente,
factorPotencia,
resistencia,
potenciaAparente,
potenciaActiva
);
¿Qué acabamos de hacer?
Usamos string.Format para construir un mensaje formateado con todos los resultados.
Nota sobre el operador ternario ? ::
esTrifasico ? "Trifásico" : "Monofásico"
Esto significa: "Si esTrifasico es true, usa 'Trifásico', si no, usa 'Monofásico'". Lo veremos en detalle en el Capítulo 5.
Paso 6: Mostrar resultados
// Mostrar en MessageBox
MessageBox.Show(
mensaje,
"Calculadora de Circuitos Eléctricos",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
Código completo del proyecto
using System;
using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
public class CalculadoraCircuitos
{
[Start]
public void Ejecutar()
{
// ========================================
// DATOS DEL CIRCUITO
// ========================================
double voltaje = 230.0; // Voltios
double corriente = 16.0; // Amperios
double factorPotencia = 0.85; // cos φ
string nombreCircuito = "Circuito de Iluminación Planta 2";
bool esTrifasico = false;
// ========================================
// CÁLCULOS
// ========================================
// Resistencia usando Ley de Ohm: R = V / I
double resistencia = voltaje / corriente;
// Potencia aparente: S = V * I
double potenciaAparente = voltaje * corriente;
// Potencia activa: P = V * I * cos φ
double potenciaActiva = voltaje * corriente * factorPotencia;
// ========================================
// CONSTRUCCIÓN DEL MENSAJE
// ========================================
string mensaje = string.Format(
"=== CALCULADORA DE CIRCUITOS ===\n\n" +
"Circuito: {0}\n" +
"Tipo: {1}\n\n" +
"DATOS DE ENTRADA:\n" +
"Voltaje: {2:F1} V\n" +
"Corriente: {3:F1} A\n" +
"Factor de potencia: {4:F2}\n\n" +
"RESULTADOS CALCULADOS:\n" +
"Resistencia: {5:F2} Ω\n" +
"Potencia aparente: {6:F2} VA\n" +
"Potencia activa: {7:F2} W",
nombreCircuito,
esTrifasico ? "Trifásico" : "Monofásico",
voltaje,
corriente,
factorPotencia,
resistencia,
potenciaAparente,
potenciaActiva
);
// ========================================
// MOSTRAR RESULTADOS
// ========================================
MessageBox.Show(
mensaje,
"Calculadora de Circuitos Eléctricos",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
}
Ejercicio: Cambia los valores de voltaje, corriente y factorPotencia para probar diferentes circuitos.
Deep Dive: Entendiendo en profundidad
Tipos de datos numéricos adicionales
C# tiene más tipos numéricos para casos específicos:
Enteros de diferentes tamaños:
byte numeroSmall = 255; // 0 a 255 (8 bits)
short numeroMedio = 32000; // -32,768 a 32,767 (16 bits)
int numeroNormal = 2000000; // -2.1B a 2.1B (32 bits)
long numeroGrande = 9000000000L; // -9.2E18 a 9.2E18 (64 bits)
Decimales de diferentes precisiones:
float precisionBaja = 123.45f; // ~7 dígitos de precisión
double precisionMedia = 123.456789; // ~15-17 dígitos
decimal precisionAlta = 123.456789012345m; // ~28-29 dígitos
¿Cuándo usar cada uno?
- int: Para contar cosas (páginas, cables, bornes) - 99% de los casos
- double: Para cálculos eléctricos (voltajes, corrientes, resistencias)
- decimal: Para cálculos financieros (precios, costos) donde necesitas precisión exacta
El problema de la precisión de punto flotante
Los tipos float y double tienen limitaciones de precisión:
double valor1 = 0.1;
double valor2 = 0.2;
double suma = valor1 + valor2;
// Esperarías: 0.3
// Obtienes: 0.30000000000000004
Solución 1: Redondear cuando sea necesario:
double resultado = Math.Round(suma, 2); // 0.3
Solución 2: Usar decimal para valores exactos:
decimal precio1 = 0.1m;
decimal precio2 = 0.2m;
decimal precioTotal = precio1 + precio2; // Exactamente 0.3
Valores por defecto
Si no inicializas una variable de clase, tiene un valor por defecto:
int numero; // 0
double decimal; // 0.0
bool estado; // false
string texto; // null
Pero en variables locales (dentro de métodos), debes inicializar antes de usar.
Constantes
Para valores que nunca cambian, usa const:
const double PI = 3.14159265359;
const int VOLTAJE_NOMINAL_EU = 230;
const double FRECUENCIA_RED = 50.0; // Hz en Europa
// Intentar cambiarlas da error:
PI = 3.14; // ERROR: Cannot assign to a constant
Convención: constantes en MAYÚSCULAS con guiones bajos.
Mejores prácticas
1. Inicializa siempre las variables
// Mal
int contador;
contador++; // Puede dar error
// Bien
int contador = 0;
contador++;
2. Usa nombres descriptivos
// Mal
double v = 230;
double i = 16;
double p = v * i;
// Bien
double voltaje = 230.0;
double corriente = 16.0;
double potencia = voltaje * corriente;
3. Agrupa variables relacionadas
// Bien organizado
// Datos del circuito
double voltaje = 230.0;
double corriente = 16.0;
double factorPotencia = 0.85;
// Datos del cliente
string nombreCliente = "Acme Corp";
string proyecto = "Planta Nueva";
int numeroPedido = 2025001;
4. Usa el tipo más simple que funcione
// Innecesariamente complejo
decimal cantidadCables = 47m;
// Mejor
int cantidadCables = 47;
Errores comunes
Error 1: Dividir enteros esperando decimal
Síntoma: El resultado de una división es 0 cuando esperabas un decimal.
Causa: Al dividir dos int, el resultado es int (se trunca).
int totalCables = 10;
int bandejas = 3;
int cablesPorBandeja = totalCables / bandejas; // 3, no 3.33!
Solución: Convierte al menos uno a double:
double cablesPorBandeja = (double)totalCables / bandejas; // 3.333...
Error 2: Olvidar el sufijo en float/decimal
Síntoma: Error de compilación al asignar un literal.
float valor = 123.45; // ERROR: Cannot implicitly convert double to float
decimal precio = 99.99; // ERROR: Cannot implicitly convert double to decimal
Solución: Agrega el sufijo apropiado:
float valor = 123.45f; // 'f' para float
decimal precio = 99.99m; // 'm' para decimal
Error 3: Usar string sin comillas
Síntoma: Error de compilación.
string nombre = Cliente; // ERROR: 'Cliente' does not exist
Solución: Texto siempre entre comillas:
string nombre = "Cliente";
Desafíos (Opcional)
Si quieres practicar más, intenta:
Desafío 1: Calculadora de caída de tensión
Dificultad: Bajo
Calcula la caída de tensión en un cable usando:
- Fórmula: ΔV = 2 × L × I × ρ / S
- L = longitud del cable (metros)
- I = corriente (Amperios)
- ρ = resistividad del cobre (0.018 Ω·mm²/m)
- S = sección del cable (mm²)
Pista
Declara variables para cada parámetro, luego aplica la fórmula directamente.
Solución
using System;
using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
public class CaidaTension
{
[Start]
public void Ejecutar()
{
// Datos del cable
double longitudMetros = 50.0;
double corrienteAmperios = 16.0;
double seccionMM2 = 2.5;
double resistividadCobre = 0.018; // Ω·mm²/m
// Cálculo de caída de tensión
double caidaTension = 2 * longitudMetros * corrienteAmperios * resistividadCobre / seccionMM2;
// Resultado
string mensaje = string.Format(
"CÁLCULO DE CAÍDA DE TENSIÓN\n\n" +
"Longitud: {0} m\n" +
"Corriente: {1} A\n" +
"Sección: {2} mm²\n\n" +
"Caída de tensión: {3:F2} V",
longitudMetros,
corrienteAmperios,
seccionMM2,
caidaTension
);
MessageBox.Show(mensaje, "Caída de Tensión", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
Desafío 2: Convertidor de unidades eléctricas
Dificultad: Bajo
Crea un script que convierta:
- kW a HP (caballos de fuerza)
- HP a kW
- mm² a AWG (aproximado)
Conversiones:
- 1 HP = 0.746 kW
- 1 kW = 1.341 HP
Pista
Declara variables para cada valor de entrada, luego multiplica por los factores de conversión.
Conceptos clave para recordar:
- Siempre inicializa tus variables
- Usa el tipo apropiado para cada dato
- Nombres descriptivos hacen el código más legible
- La división de enteros trunca el resultado
Preguntas frecuentes
P: ¿Por qué usar double en vez de float para cálculos eléctricos?
R: double tiene el doble de precisión que float (15-17 dígitos vs 7 dígitos). Para cálculos eléctricos donde la precisión importa, double es la opción estándar. Además, es el tipo por defecto en C# para literales decimales.
P: ¿Cuándo debo usar decimal en vez de double?
R: Usa decimal para cálculos financieros (precios, costos, presupuestos) donde necesitas precisión exacta. Para cálculos de ingeniería (voltajes, corrientes, resistencias), double es suficiente y más eficiente.
P: ¿Puedo cambiar el tipo de una variable después de declararla?
R: No. C# es fuertemente tipado. Una vez que declaras int numero, esa variable siempre será int. Si necesitas otro tipo, debes declarar una nueva variable.
P: ¿Por qué mi división de enteros da 0?
R: Porque al dividir dos int, el resultado es int y se trunca. Solución: convierte al menos uno a double antes de dividir: (double)dividendo / divisor.
P: ¿Importa si uso 230 o 230.0 para un double?
R: Funcionalmente no, pero 230.0 es más claro y explícito. Es una buena práctica usar .0 para indicar que es un número decimal.
Última actualización: Enero 2026