valor referencia programacion por pasaje parametros parametro opcional metodos metodo mandar llamar funciones definir con como c# generics func inline-method

referencia - C#- ¿Cómo puedo definir un método en línea Func<T> como parámetro?



parametros por valor y referencia en c (3)

He escrito una clase de gestión de SessionItem simple para manejar todas esas molestas verificaciones nulas e insertar un valor predeterminado si no existe. Aquí está mi método GetItem:

public static T GetItem<T>(string key, Func<T> defaultValue) { if (HttpContext.Current.Session[key] == null) { HttpContext.Current.Session[key] = defaultValue.Invoke(); } return (T)HttpContext.Current.Session[key]; }

Ahora, ¿cómo lo uso en realidad, pasando el Func <T> como un parámetro de método en línea?


¿Por qué no pasas el valor predeterminado directamente? ¿De qué sirve el functor?

Por cierto, defaultValue.Invoke() es bastante detallado. También es posible simplemente escribir defaultValue() .


Como es un func, una lambda sería la forma más simple:

Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));

Donde [new Foo ("blah")] es el func que se invoca como predeterminado.

También puedes simplificar a:

return ((T)HttpContext.Current.Session[key]) ?? defaultValue();

Dónde ?? es el operador de coalescencia nula: si el primer arg no es nulo, se devuelve; de lo contrario, la mano derecha se evalúa y se devuelve (por lo que defaultValue () no se invoca a menos que el elemento sea nulo).

Finalmente, si solo quieres usar el constructor predeterminado, entonces podrías agregar una restricción "new ()":

public static T GetItem<T>(string key) where T : new() { return ((T)HttpContext.Current.Session[key]) ?? new T(); }

Esto todavía es flojo: el nuevo () solo se usa si el artículo fue nulo.


var log = SessionItem.GetItem("logger", () => NullLog.Instance)

Tenga en cuenta que normalmente puede omitir la especificación {T} en la llamada GetItem {T} (si Func {T} devuelve un objeto del mismo tipo)