1.2 Práctica con el lenguaje¶
Estructura de un programa C#¶
Desde C# 9 un programa puede ser solo una lista de instrucciones, sin clase ni Main. Se llaman instrucciones de nivel superior (top-level statements):
// Programa completo: se guarda como Program.cs
Console.WriteLine("Hola, C#");
Console.WriteLine(Cuadrado(5)); // 25
int Cuadrado(int n) => n * n; // una función local
La forma clásica, que sigue siendo válida y es la que ves en libros y proyectos antiguos, mete todo en una clase con un método Main:
using System;
class Programa
{
static int Cuadrado(int n) => n * n;
static void Main()
{
Console.WriteLine("Hola, C#");
Console.WriteLine(Cuadrado(5)); // 25
}
}
Reglas básicas: cada instrucción termina en ;, los bloques van entre { } y C# distingue mayúsculas de minúsculas (Console no es console). Las directivas using indican qué espacios de nombres usas; en los proyectos actuales los más comunes (System, System.Linq, System.Collections.Generic...) ya están incluidos de forma implícita.
Variables¶
string nombre = "Ana"; // tipo explícito
int edad = 20;
edad = 21; // se puede cambiar
var altura = 1.68; // el compilador deduce el tipo: double
double peso; // declarada, sin valor todavía
peso = 62.5; // hay que darle valor antes de leerla
Console.WriteLine($"{nombre} tiene {edad} años y mide {altura}");
var no significa «cualquier tipo»: el tipo se fija al compilar según el valor inicial. C# es de tipado estático.
Variables que pueden valer null
En los proyectos nuevos, los tipos de referencia (como string) no admiten null salvo que lo indiques con ?: string? apodo = null;. Para los números se hace igual con int? edad = null;. Se da un valor por defecto con ?? y se accede con seguridad con ?..
Constantes¶
| Forma | Cuándo se asigna | Ejemplo |
|---|---|---|
const |
En compilación, para valores que no cambian nunca | const double Iva = 0.21; |
readonly |
Una vez, en la creación del objeto (en una clase) | readonly DateTime inicio = DateTime.Now; |
Una const solo puede ser un número, un texto o un valor simple fijo. Por convención se escriben con la primera letra en mayúscula.
Literales¶
42 (int), 42L (long), 3.14 (double), 3.14f (float), 3.14m (decimal), 'a' (char), "hola" (string) y true (bool). Se pueden separar los miles con guion bajo: 1_000_000.
Operadores¶
Console.WriteLine(7 + 2); // 9
Console.WriteLine(7 / 2); // 3 (int / int = división entera)
Console.WriteLine(7 / 2.0); // 3,5 (con el separador decimal de tu idioma)
Console.WriteLine(7 % 2); // 1
Console.WriteLine(3 > 2 && 2 > 1); // True
int x = 5;
x += 2; // 7
x++; // 8
Console.WriteLine(x);
string? apodo = null;
Console.WriteLine(apodo ?? "sin apodo"); // sin apodo
Console.WriteLine(x > 5 ? "grande" : "pequeño"); // operador condicional
Grupos: aritméticos (+ - * / %), relacionales (== != < > <= >=), lógicos (&& || !), asignación (= += -= ++ --) y los propios de C#: ?? (valor por defecto si es null), ?. (acceso seguro) y ? : (condicional).
Comparar textos
En C# == entre string compara el contenido, como en Kotlin y Python, y a diferencia de Java.
Entrada y salida¶
Console.Write("¿Cómo te llamas? ");
string? nombre = Console.ReadLine();
Console.WriteLine($"Hola, {nombre}"); // interpolación de texto
Console.WriteLine($"Tienes {20 + 1} años"); // admite expresiones entre llaves
Console.ReadLine() devuelve string?, porque puede ser null si no hay más datos de entrada (por ejemplo, al acabar un archivo redirigido). Write no añade salto de línea y WriteLine sí.
Comentarios¶
// Comentario de una línea
/* Comentario
de varias líneas */
/// <summary>Comentario de documentación XML: lo lee el IDE</summary>