2010-12-16 9 views
12

Cuál es mejor en, digamos, tipo de parámetro en un método (no relacionado con LINQ). Aparentemente Func es mejor, ya que es más simple, más descriptivo, y si todos usan esto, todo se volverá compatible (bien). Sin embargo, noté que Microsoft usa su propio delegado en algunas bibliotecas, por ejemplo, controladores de eventos. Entonces, ¿cuáles son las ventajas y desventajas de cualquiera de ellos? ¿Cuándo debería usarlo?usa Func <> (o Acción <>) o crea un delegado propio?

ediciones:

  • Al parecer Func <> sólo estaba disponible en el punto 3.5, así que esto puede ser posible, la razón principal que vi delegados no Func. ¿Alguna otra razón para no usar Func? (Ejemplo: this es de .NET4)

  • La misma pregunta se aplica también para la Acción <>

+0

¿Qué bibliotecas? probablemente esas bibliotecas son viejas y desarrolladas antes de .Net 3.5 (esp para EventHandler) –

+0

principalmente en controladores de eventos, pero también lo vi en otras bibliotecas, intentaré recordar –

+0

'Func <>' no existía hasta .net 3.5. La mayoría del controlador de eventos antes de eso. –

Respuesta

5

Func <> es útil cuando está muy claro lo que están acostumbrados a, y el número de las entradas son pequeñas.

Cuando el número de entradas es mayor, o podría haber alguna ambigüedad con respecto a la intención, entonces usar un delegado con argumentos nombrados hace las cosas más claras.

+0

si el número de entradas es más grande, no es más difícil recordarlos si se llama LotsOfInputFunction que, Func . Y si el intento no está claro, puedo aclararlo en nombre de variable o nombre de parámetro, ¿no? –

+3

Me refiero a la intención de cada parámetro. Por ejemplo: Func - solo mirando esto es difícil/imposible inferir para qué sirve. Además, agregar un parámetro puede significar refactorizar una cantidad significativa de código y potencialmente romper interfaces. –

+0

+1 para el comentario sobre los cambios en cascada – Grokodile

0

Siempre se puede crear una clase que tiene el número n de entrada como propiedades de la clase y pasar el objeto de la clase una sola entrada en el <> delegado func

+0

¿cómo responde esto a la pregunta? –

1

Ellos son a todos los efectos el mismo, excepto cuando el método tiene un parámetro Expression. Esos deben definirse como 'lambda' y no como delegate. Esto sería muy problemático al tratar con IQueryable y obtener el IEnumerable invocado/resuelto en su lugar (por ejemplo, LINQ2SQL).

1

Func <> y Acción <> son preferibles si son realmente apropiados en su caso. Runtime crea instancias de cada tipo utilizado en su programa, y ​​si usa Func una vez significa que se creó la instancia de tipo. En el caso de delegados personalizados, las cosas van de diferente manera y se crearán nuevos tipos aunque sean esencialmente similares a los existentes.

Sin embargo, a veces los delegados personalizados hacen que el código sea más claro.

1

Sin embargo, noto que Microsoft usa su propio delegado en algunas bibliotecas, por ejemplo, controladores de eventos. Entonces, ¿cuáles son las ventajas y desventajas de cualquiera de ellos? ¿Cuándo debería usarlo?

Algo de esto es histórico: APIs definidos antes de C# 3/.NET3 cuando se añadieron Action<> y Func<>. Para los eventos EventHandler<T> es una mejor opción para eventos porque hace cumplir la convención correcta.

+0

[this] (http://msdn.microsoft.com/en-us/library/system.activities.bookmarkcallback.aspx) es de .NET 4 –

+1

@Louis ... en otro lugar en WF4 ['Func <>' es used] (http://msdn.microsoft.com/en-us/library/system.activities.workflowapplication.onunhandledexception.aspx) así que es extraño. ¿Uno que se deslizó a través de la revisión de consistencia? – Richard

Cuestiones relacionadas