2008-09-03 15 views

Respuesta

23

métodos parciales por razones similares a qué clases parciales estaban en .Net 2.

una clase parcial es uno que se puede dividir en varios archivos - el compilador todos ellos se basa en un archivo, ya que corre .

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

El ejemplo más común es el diseñador de formularios. Los desarrolladores no quieren colocar botones, cuadros de entrada, etc. a mano la mayor parte del tiempo.

  • En .Net 1 era código generado automáticamente en un bloque #region
  • En .Net 2 éstos se convirtió en clases separadas de diseño - la forma sigue siendo una clase, es sólo divide en un archivo editado por los desarrolladores y uno por el diseñador de formularios

Esto hace que mantener ambos sea mucho más fácil. Las fusiones son más simples y hay menos riesgo de que el diseñador de formularios VS deshaga accidentalmente los cambios manuales del programador.

En .Net 3.5 Linq ha sido introducido.Linq tiene un diseñador de DBML para construir sus estructuras de datos, y eso genera auto-código.

El toque adicional aquí es que el código necesario para proporcionar métodos que los desarrolladores podrían querer rellenar.

medida que los desarrolladores se extenderán estas clases (con archivos parciales adicionales) que no podían utilizar métodos abstractos aquí.

El otro problema es que la mayoría de las veces no se llamará a estos métodos, y llamar a los métodos vacíos es una pérdida de tiempo.

Métodos vacíos are not optimised out.

So Linq genera métodos parciales vacíos. Si no creas tu propio parcial para completarlos, el compilador de C# simplemente los optimizará.

Para que pueda hacer esto, los métodos parciales siempre vuelven vacíos.

Si crea un nuevo archivo de LINQ DBML que va a generar automáticamente 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 este:

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

Si no extienda estos métodos, se optimizan al instante.

Los métodos parciales no pueden ser públicos, ya que tendrían que estar ahí para que otras clases puedan llamar. Si escribe sus propios generadores de código, puedo ver que son útiles, pero de lo contrario solo son realmente útiles para el diseñador de VS.

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 si has tenido una clase grande y complejo derramado a través de múltiples archivos es posible que desee referencias parciales en el archivo llamado. Sin embargo, creo que en ese caso debes considerar simplificar primero la clase.

+3

Gran respuesta; para agregar un poco de valor, las clases parciales también se pueden usar para agregar métodos y funcionalidad a las clases de servicio web generadas automáticamente. – TheXenocide

+0

@Keith "Los métodos parciales no pueden ser públicos, ya que tendrían que estar ahí para que otras clases llamen a" Creo que esta limitación no es válida, como p. en mi proyecto tengo aproximadamente 15 métodos en una clase y para una mejor legibilidad quiero mantenerlos en clases parciales. Pero como no puedo definirlos como públicos, me veo obligado a mantenerlos en una misma clase. –

2

Code generation es uno de los principales motivos por los que existen y una de las razones principales para usarlos.


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

2

Los veo como eventos livianos. Puede tener un archivo de código reutilizable (generalmente autogenerado, pero no necesariamente) y para cada implementación, simplemente maneje los eventos que le interesan en su clase parcial. De hecho, así es como se usa en LINQ to SQL (y por qué se inventó la función de idioma).

10

Los métodos parciales son muy similares en concepto al patrón de comportamiento GoF Template Method (Design Patterns, p325).

Permiten que el comportamiento de un algoritmo u operación se defina en un lugar y se implemente o se cambie en cualquier otro lugar, permitiendo la extensibilidad y la personalización. Empecé a usar métodos parciales en C# 3.0 en lugar de métodos de plantillas porque creo que el código es más limpio.

Una buena característica es que los métodos parciales no implementados no incurren en sobrecarga de tiempo de ejecución a medida que se compilan.

+0

Tienes razón. Gracias por la perspectiva. –

+0

sí, de verdad! qué cosa más increíble: un ser humano (usted) ve algo, ese otro no (yo) – zzfima

0

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

trato de evitar el uso de las clases parciales (con la excepción de parciales creadas por Visual Studio para los archivos de diseño, los que son grandes). Para mí, es más importante tener todo el código para una clase en un solo lugar. Si su clase está bien diseñada y representa una sola cosa (single responsibility principle), entonces todo el código para esa cosa debe estar en un solo lugar. Se han introducido

Cuestiones relacionadas