¿Método de extensión o herencia?

He utilizado ObservableCollection por Enlace de datos en mi WPF aplicación donde estoy vinculando la colección a DataGrids y ComboBoxes. Y debido a un requisito, en el que necesitaba eliminar objetos de la colección en función de una condición, implementé el RemoveAll funcionalidad, como List, utilizando Extension method.

Esta publicaciones especifica algunos méritos de Inheritance encima Extension methods pero no es muy específico para mi caso, ya que este fue el único método que necesitaba agregar y no tengo la intención de agregar otro Extension method para la Colección.

Me gustaría saber si sería mejor para mí tener esto implementado como Extension method como está o debería pensar en heredar la clase y agregarla como Instance method?

Además, me gustaría saber si hay alguna diferencia de rendimiento entre los dos, ya que no se ha discutido en la publicación mencionada.

preguntado el 27 de julio de 12 a las 14:07

considerando usar Clear como nombre, ya que esto es bien conocido por eliminar todo en una lista. Otro punto es que el compilador usará la implementación de objetos de Clear si está disponible (a menudo es mejor en rendimiento). -

Bueno, Clear() elimina todo y ese no es mi punto. -

ahh, olvidé que RemoveAll usa un predicado-Delegado... ¡lo siento! Tienes toda la razón.

Sí, lo hace y es por eso que tuve que recurrir al método Extension por lo mismo que esto no está disponible con ObservableCollection. -

3 Respuestas

Si planea mejorar solo ObservableCollection más que solo RemoveAll(), entonces subclasifique y agregue su funcionalidad. Si desea agregar RemoveAll() a algo más que una ObservableCollection, entonces puede crear un método de extensión que maneje más que solo ObservableCollections, apuntando a IEnumerable u otro padre genérico en la jerarquía. En ese método, puede probar si la colección es compatible con CollectionChanged y manejarla de manera adecuada.

Aquí no hay una respuesta correcta o incorrecta, es lo que se adapte a sus necesidades.

Respondido 27 Jul 12, 14:07

Bueno, como he especificado, no tengo la intención de agregar ninguna otra funcionalidad y uso IList a menudo cuando no tengo que hacer ningún enlace y eso ya tiene el método, no creo que necesite extender esto a cualquier otro tipo. Pero buen punto (+1) y podría usar este consejo en el futuro. - Shakti Prakash Singh

Por el bien de un método, usaría un método de extensión. En este caso, significaría que su código puede continuar usando ObservableCollection<T> sin necesidad de mantener un tipo personalizado.

Los métodos de extensión simplemente se reducen a llamadas a métodos estáticos cuando se compilan, por lo que no puedo imaginar que el rendimiento sea peor que con la herencia. En todo caso, debería ser igual o mejor.

La preferencia personal suele ser lo que impulsa la elección de los métodos de extensión.

Respondido 27 Jul 12, 14:07

Gracias. Esto responde a mi pregunta. +1. - Shakti Prakash Singh

Con un método de extensión, puede extender una interfaz, lo que da como resultado la extensión de todos los implementadores de esa interfaz.

Lo haría con un método de extensión de System.Collections.IList. System.Collections.IList se usa en todas partes...

public class static Extension
{
   public static void RemoveAll(this System.Collections.IList list)
   {
      ...
   }
}

esto extenderá casi todas las implementaciones de colección.

Respondido 27 Jul 12, 14:07

Bueno, esto se ve bien, pero supongo que no necesito extender esta funcionalidad a otros tipos en este momento. Pero una buena sugerencia. +1. - Shakti Prakash Singh

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.