2012-02-27 14 views
8

leí about partial classes y, por ejemplo, entiendo la razón por la que se utilizan cuando Visual Studio crea formas de Windows, sin descartar que¿Cuál es el propósito de las clases parciales?

cuando se trabaja en grandes proyectos, la difusión de una clase sobre archivos separados permite que múltiples programadores para trabajar en él al mismo tiempo

.

Luego leí this example y noté que la mayoría de las clases se declaran como parciales. ¿Por qué?

+0

Uno de los usos que se utiliza como nota en Winforms/WPF es un mecanismo para la parte de la máquina generada separado de la mano con código de parte. En ese sentido, si puede hacer separaciones lógicas similares de funciones de una clase, puede ser útil. – kenny

+0

Tendría que preguntarle a la persona que las escribió. – svick

+0

Si solo quiere saber en general, busque [como este] (http://stackoverflow.com/search?q=%5Bc%23%5D+partial+class). – Guvante

Respuesta

5

clases parciales permiten que el código para agregar no sólo a las clases generadas, sino también implementar la funcionalidad opcional.

Por ejemplo, puede haber código generado que realiza la validación de la propiedad (a través de IDataErrorInfo) pero la validación en cada propiedad no se puede determinar en el momento de la generación, la clase parcial permite al desarrollador especificar la validación en un momento posterior.

El archivo generado:

public partial class MyClass : IDataErrorInfo 
{ 
    partial void ValidateMyProperty(ref string error); 

    public string this[string propertyName] 
    { 
     get 
     { 
      string error = String.Empty; 
      if (propertyName == "MyProperty") 
       ValidateMyProperty(ref error); 

      return error; 
     } 
    } 

    public string Error { get { return String.Empty; } } 

    public int MyProperty { get; set; } 
} 

El archivo implementado desarrollador:

public partial class MyClass 
{ 
    partial void ValidateMyProperty(ref string error) 
    { 
     if (MyProperty < 0) 
      error = "MyProperty cannot be negative."; 
    } 
} 
1

Una aplicación práctica es que puede modificar la clase parcial en más de una ubicación, dentro del alcance del espacio de nombres. Podría hacer que una clase se divida en varios archivos por razones de legibilidad.

IE:
En HelloWorld.cs en el espacio de nombres "bleh"

public partial class testClass { 
    private int intMember; 
    public string stringMember; 
} 

En HelloWorld2.cs en el espacio de nombres "bleh"

public partial class testClass { 
    private int intAnotherInt; 
    public string stringAnotherString; 
} 

Ambas clases se declararon representar la misma cosa en realidad, pero el propósito era dividir la clase en archivos. Ambos combinados se parecen a:

public partial class testClass { 
    private int intAnotherInt; // Our int from HelloWorld2.cs 
    public string stringAnotherString; // Our string from HelloWorld2.cs 
    private int intMember; // Our int from HelloWorld.cs 
    public string stringMember; // Our string from HelloWorld.cs 
} 

Más información here.

11

Uno de los ejemplos muy buenos donde las clases parciales son útiles es cuando la clase es generada automáticamente por una herramienta (como VS) y desea ampliar la funcionalidad de esa clase y no perder su código cuando la herramienta lo necesita para regenerar su código Por ejemplo, cuando usa Visual Studio Entity Data Model Designer las entidades (clases) se generarán como parciales.

5

Si tiene una clase grande, puede ser útil dividir la definición entre varios archivos de origen.

Además, si desea extender una clase que se genera, por ejemplo, desde una plantilla T4 o mediante un ORM, o en cualquier situación donde no pueda o no deba modificar el archivo fuente original, puede usar una definición de clase parcial adicional para agregar una nueva funcionalidad que no se eliminará cuando la plantilla o ORM regenere la clase original.

Editar

Sólo una observación, pero su cotización:

cuando se trabaja en grandes proyectos, la difusión de una clase sobre archivos separados permite que varios programadores para trabajar en él, al mismo tiempo

No me sienta muy bien, a pesar de provenir de MSDN. Si usa un sistema de control de fuente decente (como TFS o incluso svn), las fusiones dentro de los archivos fuente donde cada desarrollador trabaja en métodos separados se manejan bastante bien.Decir que el uso de clases parciales hace que sea más fácil para múltiples desarrolladores trabajar en la misma clase (y, apuesto, probablemente) animó a alguien a dividir cada método y propiedad en cada clase en su solución en archivos de origen separados. Eso es malo. Muy mal. Como en, debería-ser-divulgado-al-frente-cuando-negociación-salarios-con-nuevos-empleados malos.

0

como el enlace que publicó mencionado significa que puede tener una única clase dividida en varios archivos y se recombinará en una sola clase en tiempo de compilación.

como para el otro enlace informados ... las clases parciales están marcados de esa manera porque el marcado (aspx) tiene una clase generada diseñador que le da acceso a las cosas definidas en el marcado Creo ...

lo tanto, hay tres archivos ... ProductList.aspx, productlist.cs y productlist.designer.cs

ProductList.aspx es el marcado

productlist.cs es la clase parcial que se hace referencia desde la ma archivo rkup y contiene su código.

productlist.designer.cs es la clase parcial generada que se combina con el archivo .cs anterior

+0

Hay al menos cinco archivos con cinco declaraciones de clase/interfaz parciales diferentes: clase 'ProductBLL' en el archivo _ProductBL.cs_, clase' Product' en el archivo _Product.cs_, interfaz 'IProductService' en el archivo _IProductService.cs_, clase' ProductDal' en el archivo _ProductDal.cs_, clase 'ProductService' en el archivo _ProductService.cs_. – enzom83

+0

esas son clases completamente diferentes que no tienen nada que ver entre sí. Ya expliqué el concepto en contexto. – Timmerz

+0

parcial es un concepto muy simple ... simplemente significa ... una sola clase se puede extender sobre múltiples archivos. Eso es. nada más que entender. – Timmerz