Programación procedural y programación orientada a objetos
Antes de la aparición de las clases, lenguajes como C no contaban con este concepto. El estilo de programación sin clases ni objetos, propio de lenguajes como C, se denomina programación procedural.
Programación procedural: un programa es una secuencia de instrucciones, y su objetivo principal es optimizar los pasos de ejecución.
Gracias a la existencia de las clases, podemos desarrollar programación orientada a objetos.
Programación orientada a objetos: el programa está formado por un conjunto de clases encapsuladas. La idea fundamental es agrupar los datos y las funciones que manipulan dichos datos en unidades lógicamente relacionadas; estas unidades reciben el nombre de clases (class).
Definición de clase
Una clase es una estructura de datos que contiene datos almacenados y código ejecutable. Cuenta con dos tipos de miembros:
- Miembros de datos (Data Members): almacenan los atributos del objeto: campos (Fields), constantes (Constants)
- Miembros de función (Function Members): implementan la lógica de comportamiento de los objetos: métodos, propiedades, constructores, destructores, operadores, indexadores, eventos
La clase es un conjunto que encapsula datos y funciones con relación lógica, empleado para modelar entidades del mundo real o abstracto.
En pocas palabras, una clase es una estructura de datos formada por datos y funciones. Se pueden crear objetos a partir de una clase; se accede a los datos y miembros mediante los objetos, y también directamente desde el interior de la clase.
Declaración de clase
La palabra clave class solo define una plantilla de clase, no crea instancias de objetos. Una plantilla consta de tres partes: nombre de la clase, miembros de la clase y características de la clase.
Sintaxis
class NombreClase
{
// declaración de miembros (campos, métodos, el orden no es obligatorio)
}Lenguaje del código: JavaScript (javascript)
La declaración de clase también se conoce habitualmente como definición de clase (class definition)
class Program
{
static void Main(string[] args)
{
AddCalculator addCalculator = new AddCalculator();
SubCalculator subCalculator = new SubCalculator();
}
}
class AddCalculator
{
public int A { get; set; }
public int B { get; set; }
public int Add()
{
return A + B;
}
}
class SubCalculator
{
public int A { get; set; }
public int B { get; set; }
public int Subtract()
{
return A - B;
}
}Lenguaje del código: JavaScript (javascript)
En el ejemplo anterior se declaran dos clases: una para realizar sumas y otra para restas. Dentro de la función Main del programa principal creamos instancias de ambas clases para utilizarlas.
Contenido proveniente de foxdevelop.com
No es obligatorio escribir las declaraciones de clase en orden de arriba hacia abajo. Puedes declarar clases en la parte inferior del código y llamarlas desde la función Main situada más arriba. La clase no es más que una plantilla o plano. El código no se ejecuta secuencialmente desde arriba; la ejecución empieza en Main y el programa busca la plantilla correspondiente cuando la necesita.

Miembros de clase
Campos (Fields)
Un campo es una variable perteneciente a una clase. Puede ser de tipo nativo o definido por el usuario y admite operaciones de lectura y escritura de datos.
Tipo NombreCampo;
class MyClass
{
int MyField; // campo de tipo int llamado MyField
}Lenguaje del código: JavaScript (javascript)
Diferencia importante respecto a C/C++: C# no dispone de variables globales. Todos los campos deben declararse dentro de un tipo (clase o estructura).
Reglas de inicialización de campos
(1) Inicialización implícita (sin asignación de valor)
El compilador asigna automáticamente un valor predeterminado según el tipo; cada tipo tiene un valor predeterminado distinto.
int F1; // valor predeterminado 0
string F2; // valor predeterminado nullLenguaje del código: JavaScript (javascript)
La siguiente tabla recoge los tipos de C# y sus valores predeterminados para campos. Esta regla solo aplica a campos; las variables locales deben ser inicializadas manualmente por el desarrollador.
Tipos de valor primitivos
| Tipo de dato | Valor predeterminado | Descripción |
|---|---|---|
sbyte | 0 | Entero de 8 bits con signo |
byte | 0 | Entero de 8 bits sin signo |
short | 0 | Entero de 16 bits con signo |
ushort | 0 | Entero de 16 bits sin signo |
int | 0 | Entero de 32 bits con signo |
uint | 0 | Entero de 32 bits sin signo |
long | 0L | Entero de 64 bits con signo |
ulong | 0UL | Entero de 64 bits sin signo |
float | 0.0f | Número de coma flotante simple precisión |
double | 0.0d | Número de coma flotante doble precisión |
decimal | 0.0m | Decimal de alta precisión |
char | '\0' (carácter nulo, ASCII 0) | Carácter individual |
bool | false | Tipo booleano |
Enumeración Enum | Elemento de enumeración correspondiente al entero base 0 | Las enumeraciones se basan en enteros, valor predeterminado 0 |
Estructura struct | Cada campo toma su valor predeterminado correspondiente | Tipo de valor personalizado, se inicializa a cero en su totalidad |
Tipos de referencia
Todos los tipos de referencia tienen como valor predeterminado null, lo que significa que no apuntan a ningún objeto en el área de memoria heap.
Es decir, no almacenan ninguna dirección de memoria válida. Recuerda el diagrama de memoria visto anteriormente: los tipos de referencia guardan direcciones de heap como 000001 01010. Cuando el valor es null, no hay ninguna dirección válida almacenada.
| Categoría de tipo | Ejemplos de tipos | Valor predeterminado |
|---|---|---|
| Tipos de referencia nativos | string, object | null |
Clase personalizada class | Person Student | null |
| Arrays (todas las dimensiones) | int[], string[,] | null |
| Delegados / Eventos | Action, Func, delegado personalizado | null |
Interfaz interface | Cualquier variable de interfaz | null |
Ejemplos
string str; // predeterminado null
Student jason; // clase personalizada, predeterminado null
int[] arr; // array, predeterminado null
Action callback; // delegado, predeterminado nullLenguaje del código: JavaScript (javascript)
Tipos que admiten null (Nullable / T?)
Si añadimos un signo de interrogación ? después de un tipo de valor primitivo, creamos un nuevo tipo capaz de no almacenar ningún valor. Por ejemplo, int age; vale 0 por defecto si no se asigna valor. Si queremos indicar explícitamente que no existe valor alguno, escribimos int? age2;. age2 es un tipo nullable y admite asignar null: int? age2 = null;
Un tipo nullable es un ValueType encapsulado, su valor predeterminado es null, lo que significa «sin valor válido».
| Sintaxis de declaración | Valor predeterminado |
|---|---|
int? num | null |
bool? flag | null |
decimal? price | null |
class Test
{
int a; // automáticamente 0
string b; // automáticamente null
bool c; // automáticamente false
}Lenguaje del código: JavaScript (javascript)
(2) Inicialización explícita
Asigna un valor mediante = en el momento de declaración. El valor asignado debe ser determinable en tiempo de compilación; no se admiten valores aleatorios ni entradas de usuario directamente.
int days = 25;
string word = "foxdevelop";Lenguaje del código: JavaScript (javascript)
(3) Sintaxis abreviada para varios campos del mismo tipo
Varias variables del mismo tipo se pueden declarar juntas separadas por comas. Está prohibido mezclar tipos distintos en una misma línea de declaración
int player, blood = 25;
string title, subTitle = "hi welcome to foxdevelop.com";Lenguaje del código: JavaScript (javascript)
Métodos (Methods)
Definición de método
Un método es un bloque de código nombrado, reutilizable y ejecutable, equivalente a las funciones miembro de C++. Al invocarse ejecuta su código interno y devuelve el control al punto de llamada. Se clasifican en métodos con valor de retorno y métodos sin valor de retorno.
Cuatro componentes de un método
- Tipo de retorno: escribe
voidsi no devuelve ningún valor - Nombre del método
- Lista de parámetros: los paréntesis
()son obligatorios incluso sin parámetros - Cuerpo del método: código ejecutable delimitado por
{}
class Program
{
static void Main(string[] args)
{
Robot robot = new Robot();
robot.SayHello();
}
}
class Robot
{
public void SayHello()
{
Console.WriteLine("Hello everyone");
Console.WriteLine("Welcome to visit foxdevelop.com");
}
}Lenguaje del código: JavaScript (javascript)
La palabra reservada public delante de public void SayHello() es un modificador de acceso, permite invocar la función desde fuera de la clase mediante la sintaxis nombreObjeto.NombreMetodo. Si no se escribe public, el nivel de acceso predeterminado es private. Los métodos privados solo se pueden llamar dentro de la clase; no son accesibles desde el exterior incluso usando una instancia como robot.

Creación de variables de clase e instancias
1. Características fundamentales de los tipos de referencia
Las clases pertenecen a los tipos de referencia. La memoria se divide en dos zonas:
- Pila (Stack): almacena variables de referencia (punteros a direcciones de memoria)
- Montón (Heap): almacena los datos reales de los objetos
2. Creación de un objeto paso a paso
1 Solo declaración de la variable de referencia (solo se asigna memoria en la pila, sin objetos en el montón)
Robot robot;
// Solo se reserva espacio para la referencia en la pila, valor indefinido, no existe ningún objeto en el montón
Lenguaje del código: JavaScript (javascript)

2 Asignación de memoria en el montón con el operador new
new NombreTipo();Lenguaje del código: JavaScript (javascript)
- Reserva memoria en el montón e inicializa automáticamente todos los campos con sus valores predeterminados
- Devuelve la dirección de referencia del objeto del montón y se asigna a la variable de la pila
robot = new Robot();
Lenguaje del código: JavaScript (javascript)

class Program
{
static void Main(string[] args)
{
Robot robot;
robot = new Robot();
}
}
class Robot
{
void SayHello()
{
Console.WriteLine("Hello everyone");
Console.WriteLine("Welcome to visit foxdevelop.com");
}
}Lenguaje del código: JavaScript (javascript)
3. Declaración e instanciación en una única línea
Robot robot = new Robot();Lenguaje del código: JavaScript (javascript)
class Program
{
static void Main(string[] args)
{
Robot robot = new Robot();
}
}Lenguaje del código: JavaScript (javascript)
Definición de clase