una método metodo matematicas genérica extensión extension estática estadistica definirse definicion debe clase c# extension-methods

c# - método - metodo de extensión matematicas



Desventajas de los métodos de extensión? (6)

El método de extensión es una característica realmente útil que puede agregar muchas funciones que desee en cualquier clase. Pero me pregunto si existe alguna desventaja que pueda traerme problemas. ¿Algún comentario o sugerencia?


En lo que respecta a las desventajas, las vería un poco como macros: puede terminar con un código que es más difícil de mantener porque es posible que otros no estén familiarizados con las extensiones que ha agregado.


Los métodos de extensión son divertidos, pero hay problemas potenciales con ellos. Por ejemplo, ¿qué sucede si escribe un método de extensión y otra biblioteca crea un método de extensión con la misma firma? Al final, tendrá dificultades para usar ambos espacios de nombres.

Además, se puede argumentar que son menos detectables. Creo que depende de esto. En algunos casos, su código debe incluirse en una clase, en otros casos está bien agregar esa funcionalidad como método de extensión.

Generalmente hago métodos de extensión como envoltorios para mis propias clases o clases de BCL, y los pongo en un espacio de nombre diferente. por ejemplo, Utils y Utils.Extensions. De esa forma, las extesiones no tienen que ser usadas.


Un par de cosas:

  • No siempre está claro de dónde viene el método de extensión a menos que esté dentro de VS.NET
  • Los métodos de extensión no pueden resolverse mediante la reflexión o la búsqueda dinámica de C # 4.0

  • La forma en que se importan los métodos de extensión (es decir, un espacio de nombres completo a la vez) no es granular. No puede importar una extensión desde un espacio de nombres sin obtener todo el resto.
  • No es inmediatamente obvio desde el código fuente donde se define el método. Esto también es una ventaja : significa que puede hacer que su código se vea coherente con el resto de los métodos del tipo, incluso si no puede colocarlo en el mismo lugar por el motivo que sea. En otras palabras, el código es más simple de entender en un nivel alto, pero más complicado en términos de exactamente lo que se está ejecutando. Yo diría que esto también es cierto para LINQ en general.
  • Solo puede tener métodos de extensión, no propiedades, indizadores, operadores, constructores, etc.
  • Si está extendiendo una clase de terceros y en una versión posterior introducen un nuevo método con la misma firma, no sabrá fácilmente que el significado de su código de llamada ha cambiado. Si el nuevo método es muy similar a su extensión, pero con condiciones de contorno sutilmente diferentes (o lo que sea), esto podría generar algunos errores muy complicados. Sin embargo, es relativamente poco probable que suceda.

Es difícil para mí imaginar agregar un método sin conocer íntimamente un código existente. Por ejemplo, si ha estado utilizando una clase de terceros para hacer algo, ¿cuál sería la necesidad de ampliar la funcionalidad de esta clase dado que no es el desarrollador original y no tiene ideas de cómo se estructuran las cosas en el ¿clase? No tiene sentido hacer algo así como no tiene sentido conducir cuando no se puede ver. En el caso de LINQ donde es implementado por los diseñadores / códigos de Microsoft, tiene mucho sentido ya que poseen el conocimiento de cómo decir una implementación interna de una secuencia y ahora quieren ampliar su funcionalidad al agregar el método Count para contar todo los elementos en la secuencia Al decir esto, me gustaría que alguien me discuta mal al dar un ejemplo realista donde se necesita el método de extensión.


  • La comprobación nula con métodos estáticos es diferente. No necesariamente mejor o peor, pero diferente, y el desarrollador debe entender eso. Ser capaz de invocar un método con un valor nulo puede ser inesperado, y puede (a veces) ser muy útil.

  • Sin polimorfismo (aunque se admite sobrecarga)

  • Puede entrar en un lío con la ambigüedad si dos métodos de extensión entran en conflicto para el tipo de fuente (y ninguno califica como "mejor"). El compilador entonces se niega a usar cualquiera ... lo que significa que agregar un método de extensión en el ensamble A puede romper * el código no relacionado en el ensamble B. Lo he visto un par de veces ...

  • No se puede usar con C # 2.0, por lo que si está escribiendo una biblioteca para C # 2.0 no ayuda

  • Necesita [ExtensionAttribute], por lo que si está escribiendo una biblioteca para .NET 2.0, entra en un pickle: si declara su propio [ExtensionAttribute], podría entrar en conflicto con un llamante de .NET 3.5.

Aunque no me malinterpretes, ¡soy un gran fanático!

Probablemente puedas adivinar que actualmente estoy escribiendo una biblioteca que necesita funcionar para usuarios de C # 2.0 y .NET 2.0, y donde (molestamente) los métodos de extensión serían realmente útiles.

* = solo para el compilador; el código que ya está compilado estará bien