¿Cuándo es apropiado utilizar clases parciales de C#?
Me preguntaba si alguien podría darme una descripción general de por qué los usaría y qué ventaja obtendría en el proceso.
El mayor uso de las clases parciales es hacer la vida más fácil a los generadores/diseñadores de código. Las clases parciales permiten que el generador simplemente emita el código que necesita y no tiene que lidiar con las ediciones del usuario en el archivo. Los usuarios también son libres de anotar la clase con nuevos miembros al tener una segunda clase parcial. Esto proporciona un marco muy claro para la separación de preocupaciones.
Una mejor manera de verlo es ver cómo funcionaban los diseñadores antes de las clases parciales. El diseñador de WinForms escupiría todo el código dentro de una región con comentarios enérgicos sobre no modificar el código. Tuvo que insertar todo tipo de heurísticas para encontrar el código generado para su posterior procesamiento. Ahora puede simplemente abrir el archivo designer.cs y tener un alto grado de confianza de que contiene sólo código relevante para el diseñador.
Otro uso es dividir la implementación de diferentes interfaces, por ejemplo:
partial class MyClass : IF3
{
// main implementation of MyClass
}
partial class MyClass : IF1
{
// implementation of IF1
}
partial class MyClass : IF2
{
// implementation of IF2
}
Aparte de las otras respuestas...
Los he encontrado útiles como trampolín en la refactorización de clases divinas. Si una clase tiene múltiples responsabilidades (especialmente si es un archivo de código muy grande), entonces me parece beneficioso agregar 1 clase parcial por responsabilidad como primer paso para organizar y luego refactorizar el código.
Esto es de gran ayuda porque puede ayudar a que el código sea mucho más legible sin afectar realmente el comportamiento de ejecución. También puede ayudar a identificar cuándo una responsabilidad es fácil de refactorizar o está muy enredada con otros aspectos.
Sin embargo, para ser claros, este sigue siendo un código incorrecto; al final del desarrollo aún desea una responsabilidad por clase ( NO por clase parcial). Es sólo un trampolín :)
- Varios desarrolladores utilizan clases parciales. Varios desarrolladores pueden trabajar fácilmente en la misma clase.
- Generador de código Las clases parciales son utilizadas principalmente por el generador de código para mantener separadas las diferentes preocupaciones.
- Métodos parciales Al utilizar clases parciales, también puede definir métodos parciales, donde un desarrollador puede simplemente definir el método y el otro desarrollador puede implementarlo.
Solo declaración de método parcial Incluso el código se compila solo con la declaración de método y, si la implementación del método no está presente, el compilador puede eliminar de manera segura ese fragmento de código y no se producirá ningún error en el tiempo de compilación.
Para verificar el punto 4. Simplemente cree un proyecto winform e incluya esta línea después del Constructor Form1 e intente compilar el código.
partial void Ontest(string s);
Aquí hay algunos puntos a considerar al implementar clases parciales: -
- Utilice la palabra clave parcial en cada parte de la clase parcial.
- El nombre de cada parte de la clase parcial debe ser el mismo, pero el nombre del archivo fuente para cada parte de la clase parcial puede ser diferente.
- Todas las partes de una clase parcial deben estar en el mismo espacio de nombres.
- Cada parte de una clase parcial debe estar en el mismo ensamblado o DLL; en otras palabras, no puede crear una clase parcial en archivos fuente de un proyecto de biblioteca de clases diferente.
- Cada parte de una clase parcial debe tener la misma accesibilidad. (es decir: privado, público o protegido)
- Si hereda una clase o interfaz en una clase parcial, todas las partes de esa clase parcial la heredan.
- Si se sella una parte de una clase parcial, se sellará toda la clase.
- Si una parte de una clase parcial es abstracta, entonces toda la clase se considerará una clase abstracta.
Un gran uso es separar el código generado del código escrito a mano que pertenece a la misma clase.
Por ejemplo, dado que LINQ to SQL utiliza clases parciales, puede escribir su propia implementación de ciertas funciones (como relaciones de muchos a muchos) y esas partes de código personalizado no se sobrescribirán cuando vuelva a generar el código.
Lo mismo ocurre con el código WinForms. Todo el código generado por Designer va en un archivo que generalmente no se toca. Su código escrito a mano va en otro archivo. De esa manera, cuando cambias algo en Designer, tus cambios no desaparecen.