Pregunta

He leído acerca de los métodos parciales en la última Especificación del lenguaje C# , por lo que entiendo los principios, pero me pregunto cómo la gente está utilizando realmente de ellos.¿Existe un patrón de diseño que se beneficia de los métodos parciales?

¿Fue útil?

Solución

Métodos parciales han sido introducidas por las mismas razones de por qué las clases parciales fueron en .Net 2.

Un parcial de clase es uno de los que se puede dividir en varios archivos - el compilador genera todos ellos en un archivo que se ejecuta.

La ventaja de esto es que Visual Studio puede proporcionar un diseñador gráfico para una parte de la clase, mientras que los codificadores de trabajo en los otros.

El ejemplo más común es el diseñador de formularios.Los desarrolladores no quieren ser el posicionamiento de los botones, las cajas de entrada, etc con la mano la mayoría de las veces.

  • En .Net 1 fue generado automáticamente el código en un #region bloque
  • En .Net 2 estas fueron separadas diseñador de clases - la forma es todavía una clase, es simplemente dividir en un archivo editado por los desarrolladores y uno por el diseñador de formularios

Esto hace que el mantenimiento sea mucho más fácil.Las uniones son más simples y hay menos riesgo de que el VS diseñador de formularios accidentalmente deshacer los codificadores de' manual de cambios.

En .Net 3.5 Linq ha sido introducido.Linq tiene un DBML diseñador para la construcción de sus estructuras de datos, y que genera automática de código.

El bit extra aquí es que el código necesario para proporcionar los métodos que los desarrolladores que desee rellenar.

Como los desarrolladores extender estas clases (con extra de los ficheros parciales) no se podía utilizar métodos abstractos aquí.

El otro problema es que la mayoría de las veces estos métodos no ser llamado, y las llamadas a métodos vacíos es una pérdida de tiempo.

Métodos vacíos no están optimizados a cabo.

Así Linq genera vacío parcial métodos.Si usted no cree su propio parciales para completar el compilador de C# acaba de optimizar ellos.

Por lo que se puede hacer esto parcial de los métodos de siempre devuelve void.

Si crea una nueva Linq archivo DBML auto-generar una clase parcial, algo así como

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

Luego, en su propio archivo parcial se puede extender esta:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

Si no se extienden estos métodos consiguen optimizado a la derecha a cabo.

Métodos parciales puede no ser público - ya que entonces tendría que estar allí para el resto de clases de la llamada.Si usted escribe su propio código de generadores puedo verlos ser útil, pero por lo demás sólo son realmente útiles para la VS diseñador.

El ejemplo que he mencionado antes es una posibilidad:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

Otro uso potencial es que si usted tenía un grande y complejo de la clase derramada a través de varios archivos que usted podría querer parcial referencias en el llamado archivo.Sin embargo, creo que en ese caso se debe considerar la simplificación de la clase de primero.

Otros consejos

Parcial métodos son muy similares en concepto a los GoF Método De Plantilla pauta de comportamiento (Patrones De Diseño, p325).

Ellos permiten que el comportamiento de un algoritmo o de operación que se define en un solo lugar e implementado o modificado en otro lugar propicio extensibilidad y personalización.He comenzado a utilizar métodos parciales de C# 3.0 en lugar de métodos de plantilla porque creo que el código es más limpio.

Una característica interesante es que sin aplicarse los métodos parciales, no incurre en ninguna sobrecarga de tiempo de ejecución como son compilados de distancia.

La generación de código es una de las principales razones por las que existen y una de las principales razones para el uso.


EDITAR:Aunque ese vínculo a la información específica de Visual Basic, los mismos principios básicos son relevantes para C#.

Yo los veo como ligero de eventos.Usted puede tener un código reutilizable archivo (normalmente autogenerado pero no necesariamente) y para cada aplicación, sólo controlar los eventos que le interesan en su clase parcial.De hecho, esta es la forma en que se utiliza en LINQ to SQL (y por qué la característica del lenguaje fue inventado).

Aquí es el mejor recurso para las clases parciales en C#.NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

Yo trate de evitar el uso de las clases parciales (con la excepción de los parciales creado por Visual Studio para el diseñador de archivos;esos son grandes).Para mí, es más importante tener todo el código para una clase en un solo lugar.Si la clase está bien diseñado y representa una cosa (principio de responsabilidad único), entonces todo el código para que una cosa debe estar en un solo lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top