Tipos parciales

    C# 2.0 da la posibilidad de distribuir las definiciones de los tipos en múltiples ficheros tales que si al compilar se pasan todos juntos al compilador, éste automáticamente los fusionará en memoria y generará el MSIL correspondiente a su unión. A estos tipos se les conoce como tipos parciales y pueden ser definiciones tanto de clases como de estructuras e interfaces, pero no de enumeraciones o delegados ya que estas suelen ser definiciones tan sencillas que dividirlas resultaría muy poco o nada útil.

    Los tipos parciales facilitan separar los códigos obtenidos automáticamente mediante generadores de código (como VS.NET 2005) de las modificaciones se les realicen a mano tras su generación, pues permiten regenerarlos en cualquier momento sin que con ello se pierdan dichos cambios. Además, también son útiles para agilizar el desarrollo y mantenimiento de las tipos de datos, pues permiten que varias personas puedan estar trabajando simultáneamente en diferentes secciones de un mismo tipo de dato.

    Para definir un tipo parcial simplemente con basta declararlo varias veces en el mismo o en diferentes ficheros, añadiéndoles un nuevo modificador partial y manteniendo siempre el mismo nombre completo, parámetros tipo, modificadores de visibilidad y clase base. Las restricciones de los parámetros tipos no tienen porqué aparecer en todas las partes, pero si lo hace deben ser siempre las mismas. Por ejemplo, en un fichero clientes.cs se podría tener:


 interface I1
 {
  void F();
 }
 [MiAtributo1] [MiAtributo2("Test1")] 
 public partial class Clientes
 {
  public int X;
 }

    Y en otro fichero llamado clientes-ampliación.cs:


 public partial class Clientes: I1
 {}
 interface I2
 {
  void G();
 }
  [MiAtributo2("Test2")] 
  public partial class Clientes: I2
  {
  void I1.F()
   {}
  public void G()
   {}
  }

    Si al compilar se especifican ambas ambos ficheros simultáneamente, como en:


 csc /t:library clientes.cs clientes-ampliación.cs

    El compilador considerará que la definición de la clase Clientes es la siguiente:


 [MiAtributo1, MiAtributo2("Test1"), MiAtributo2("Test2")]
 public class Clientes: I1, I2
  {            
   public int X;
   void I1.F()            
   {}            
   public void G()            
   {}
  }

    Nótese que en una parte de una definición parcial se podrán referenciar identificadores (miembros, interfaces implementadas explícitamente, etc.) no declarados en ella sino en otras partes de la definición, puesto que mientras al compilar se le pasen al compilador las partes donde están definidos, la fusión producirá una clase válida. No obstante, hay que señalar que esto tiene pequeñas algunas limitaciones y no es aplicable a:

  • Modificador unsafe: Por seguridad, aplicarlo a la definición de una parte de un tipo no implicará que se considere aplicado al resto y puedan utilizarse en ellas punteros, sino que deberá de aplicarse por separado a cada parte en la que se vaya a hacer uso de características inseguras.
  • Directiva using: En cada parte de una definición parcial se puede utilizar diferentes directivas using que importen diferentes espacios de nombres y definan diferentes alias. Al analizar cada parte, el compilador tan sólo interpretará las directivas using especificadas en ella, admitiéndose incluso que en varias partes se definan alias con el mismo nombre para clases o espacios de nombres diferentes.

    El uso de tipos parciales no obstante introduce el problema de que el mantenimiento de código particionados puede ser más complicado al estar distribuida su implementación a lo largo de múltiples ficheros. Sin embargo, herramientas como la Vista de Clases de VS.NET 2005 solucionan esto proporcionando una vista unificada de la estructura de estos tipos con el resultado de la fusión de todas sus partes.

Tipos parciales
José Antonio González Seco

José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.
Fecha de alta:11/12/2006
Última actualizacion:11/12/2006
Visitas totales:10356
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com