C # - Comment définir une méthode en ligne Func < T > en paramètre?
-
03-07-2019 - |
Question
J'ai écrit une simple classe de gestion SessionItem pour gérer toutes ces vérifications nulles et insérer une valeur par défaut s'il n'en existe aucune. Voici ma méthode 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];
}
Maintenant, comment puis-je l'utiliser, en passant dans le fichier Func < T > comme paramètre de méthode en ligne?
La solution
Puisqu'il s'agit d'une fonction, un lambda serait le moyen le plus simple:
Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));
Où [new Foo ("blah")] est la fonction invoquée par défaut.
Vous pouvez également simplifier pour:
return ((T)HttpContext.Current.Session[key]) ?? defaultValue();
Où ?? est l'opérateur de coalescence nulle - si le premier argument est non nul, il est renvoyé; sinon, la main droite est évaluée et renvoyée (ainsi, defaultValue () n’est pas appelé à moins que l’élément ne soit null).
Enfin, si vous souhaitez simplement utiliser le constructeur par défaut, vous pouvez ajouter un " new () " contrainte:
public static T GetItem<T>(string key)
where T : new()
{
return ((T)HttpContext.Current.Session[key]) ?? new T();
}
Ceci est toujours paresseux - la nouvelle () n'est utilisée que si l'élément était null.
Autres conseils
Pourquoi ne transmettez-vous pas la valeur par défaut directement? A quoi sert le foncteur?
Au fait, defaultValue.Invoke ()
est assez détaillé. Il est également possible d'écrire simplement defaultValue ()
.
var log = SessionItem.GetItem("logger", () => NullLog.Instance)
Remarque, , vous pouvez ignorer normalement la spécification {T} dans l'appel GetItem {T} (si Func {T} renvoie un objet du même type)