He leído acerca de los métodos parciales en la última C# language specification, así que entiendo los principios, pero me pregunto cómo la gente realmente los está usando. ¿Hay un patrón de diseño particular que se beneficie de métodos parciales?¿Cómo se usan los métodos parciales en C# 3.0?
Respuesta
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.
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#.
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).
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.
Tienes razón. Gracias por la perspectiva. –
sí, de verdad! qué cosa más increíble: un ser humano (usted) ve algo, ese otro no (yo) – zzfima
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
- 1. C# ¿Por qué los métodos parciales usan ref, pero no salen?
- 2. ¿Por qué los métodos auxiliares se usan frecuentemente en Javascript?
- 3. ¿Cómo se usan los marcadores en vi?
- 4. ¿Cómo se instancian los métodos genéricos en C#?
- 5. Cómo unitar los métodos de prueba que usan System.Web.Security.Membership inside?
- 6. ¿Por qué los métodos parciales deben ser anulados?
- 7. Implementar métodos parciales en varios ensambles
- 8. ¿Cómo se usan los marcos de CSS?
- 9. ¿Por qué se usan los signos de admiración en los métodos de Ruby?
- 10. Clases parciales en C#
- 11. XML Comentando sobre clases/métodos parciales
- 12. ¿Por qué necesita métodos parciales en C#? ¿Se pueden usar eventos para lograr el mismo objetivo?
- 13. ¿Cómo funcionan los métodos virtuales en C#?
- 14. ¿Cómo funcionan los métodos asíncronos en C#?
- 15. ¿Cómo se usan los registros fs/gs en Linux AMD64?
- 16. ¿Cómo se definen los parciales de bigote en HTML?
- 17. Python 3.0 - los métodos dict devuelven vistas - ¿por qué?
- 18. ¿Cuál es la diferencia entre los métodos anónimos (C# 2.0) y las expresiones lambda (C# 3.0)?
- 19. C# Clases parciales
- 20. MVC Métodos parciales con parámetros dinámicos
- 21. Los métodos estáticos en C++
- 22. Los métodos xx y yy usan la misma SOAPAction
- 23. Diferencia entre las clases parciales C# y Objective C?
- 24. ¿Cómo se compilan los métodos de extensión?
- 25. ¿Cómo se usan los manipuladores genéricos (ASHX) en ASP.NET MVC?
- 26. llamando a los métodos C++ desde C
- 27. ¿Los modelos de vista se usan en los rieles?
- 28. Creando clases parciales en C#
- 29. Aparte de las consultas LINQ, ¿cómo se usan los tipos anónimos en C#?
- 30. ¿Cómo se evita esperar a los requisitos cuando se usan métodos de desarrollo ágiles iterativos como SCRUM?
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
@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. –