En C#, el modificador partial no se limita solo a clases. También puede aplicarse a métodos, propiedades y hasta indexadores.
Esta característica permite dividir y extender la definición de estos elementos, haciendo que el código sea más limpio, modular y mantenible.
Una clase parcial es aquella que puede ser dividida en múltiples archivos.
Cada fragmento de la clase debe usar el modificador partial.
Veamos un ejemplo:
// Archivo Persona_Datos.cs
public partial class Persona
{
public string Nombre { get; set; }
}
// Archivo Persona_Operaciones.cs
public partial class Persona
{
public string ObtenerNombreCompleto() => Nombre;
}
Al compilar, el compilador junta todas las partes como si estuvieran en un único archivo.
Un método parcial (partial void) permite declarar un método que puede (o no) ser implementado en otra parte de la clase.
Si no se implementa, el compilador simplemente lo ignora, como si nunca hubiera existido.
Vamos con el ejemplo:
// Declaración
public partial class Persona
{
partial void ValidarNombre();
}
// Implementación opcional
public partial class Persona
{
partial void ValidarNombre()
{
if (string.IsNullOrEmpty(Nombre))
{
Console.WriteLine("Nombre inválido");
}
}
}
- Los métodos parciales siempre deben ser void.
- No pueden tener modificadores de acceso (`public`, `private`, etc.).
- No pueden ser virtuales ni static ni async.
Propiedades Parciales (desde C# 12)
Desde C# 12, se pueden crear propiedades parciales, permitiendo que la lógica de getters y setters sea definida en distintas partes del código.
public partial class Persona
{
public partial string Nombre { get; set; }
}
// En otro archivo:
public partial class Persona
{
public partial string Nombre
{
get => _nombre;
set => _nombre = value.Trim();
}
private string _nombre;
}
Con esta característica se puede separar la definición de una propiedad de su comportamiento, facilitando la generación automática de propiedades o su personalización.
Un indexador parcial permite dividir la definición de un indexador (this[...]) en varias partes.
Por ejemplo:
public partial class MiColeccion
{
public partial string this[int index] { get; set; }
}
// En otro archivo:
public partial class MiColeccion
{
private string[] _datos = new string[10];
public partial string this[int index]
{
get => _datos[index];
set => _datos[index] = value;
}
}
Partial es muy importante porque:
- Separar código generado automáticamente del código personalizado.
- Mejorar la legibilidad y mantenimiento en proyectos grandes.
- Permitir que distintos desarrolladores trabajen simultáneamente en distintas partes de una clase.
- Facilitar extensiones futuras sin modificar directamente el código base.
El soporte de C# para clases, métodos, propiedades e indexadores parciales te da un gran poder para modularizar tu código de forma clara y ordenada.
Esta es una característica que, bien aprovechada, puede hacer una gran diferencia en proyectos de cualquier tamaño.