proyectos ejemplos c#-4.0 delegates refactoring action func

c# 4.0 - ejemplos - C#forma de escribir Func con retorno nulo



django (3)

Tengo las siguientes dos funciones, que son casi idénticas, la única diferencia es que uno usa func , la otra action . Y me gustaría combinarlos en una función si es posible.

private static void TryCatch(Action action) { try { action(); } catch (Exception x) { Emailer.LogError(x); throw; } } private static TResult TryCatch<TResult>(Func<TResult> func) { try { return func(); } catch (Exception x) { Emailer.LogError(x); throw; } }


Hago esto como sugiere @ReedCopsey.

Esta es la sintaxis más simple que he encontrado:

private static void TryCatch( Action action ) { TryCatch( () => { action(); return 0; } ); }


La combinación de estos dos en una función en C # realmente no es posible. El void en C # y CLR simplemente no es un tipo y, por lo tanto, tiene una semántica de retorno diferente de una función no nula. La única forma de implementar correctamente dicho patrón es proporcionar una sobrecarga para los delegados anulados y no vacíos

La limitación CLR no significa que sea imposible de hacer en todos los lenguajes CLR. Es simplemente imposible en idiomas que usan void representar una función que no devuelve ningún valor. Este patrón es muy factible en F # porque usa Unit lugar de void para los métodos que no devuelven un valor.


Puede usar su segunda versión, Func<T> , para implementar el método de Action simplemente envolviendo la Acción en una lambda. Esto elimina parte del código duplicado.

private static void TryCatch(Action action) { Func<object> fun => { action(); return null; }; TryCatch(fun); }

Una vez dicho esto, hay gastos adicionales involucrados en hacer esto, así que, personalmente, probablemente lo deje de la forma en que lo implementan actualmente (especialmente teniendo en cuenta lo corto y simple que es su versión original en este caso).