Je veux faire ce si l'une des propriétés est null, je veux que la voie soit nulle, ou "" serait mieux. P> Y a-t-il un moyen élégant de le faire sans ternaires? P> Idéalement, je voudrais ce comportement (sans la performance horrible et la laideur)
Chemin de chaîne; p> merci p> p> p>
4 Réponses :
Le chemin le plus court et le plus performant consiste à effectuer le chèque null contre tous les niveaux. Pour la réutilisation, vous pouvez envelopper ce code dans une fonction d'assistance ou peut-être une méthode d'extension. Cela vous permettra d'y accéder en toute sécurité via cette fonction, mais effectuez toujours systématiquement le chèque NULL.
Exemple: P>
public void DoSomething() { // Get the path, which may be null, using the extension method var contextPath = HttpContext.Current.RequestPath; } public static class HttpContextExtensions { public static string RequestPath(this HttpContext context) { if (context == null || context.Request == null) { return default(string); } return context.Request.ApplicationPath; } }
C'est court parce qu'il encapsule les chèques d'une méthode réutilisable; Signification que chaque fois que vous souhaitez obtenir la valeur, il n'est qu'un seul appel de méthode. C'est mieux que d'essayer de réaliser systématiquement les mêmes chèques nuls dans de nombreux endroits et aussi plus simple.
c # 6 a été publié il y a quelque temps et il est expédié avec un opérateur de propagation null ?. code>, qui simplifierait votre cas à: p>
public static class Extensions
{
// safe null-check.
public static TOut IfNotNull<TIn, TOut>(this TIn v, Func<TIn, TOut> f)
where TIn : class
where TOut: class
{
if (v == null) return null;
return f(v);
}
}
Toute façon raisonnable de remplacer un opérateur pour faire cela?
@Ak_ Nope, vous ne pouvez pas simplement définir votre propre opérateur de marque et remplacer ... ce serait méchant dans ce cas :) .NET Équipe est au courant des «demandes» faites pour ce type de fonctionnalité, mais afaik il a gagné 't Expédier en C # 5 -> ici et ici
(Suite, bah, timeout sur les modifications) Je ne peux pas voir un moyen de remplacer cette fonctionnalité en tant qu'opérateur, compte tenu de l'acceptation d'une expression Lambda - je ne sais pas si cela est possible, mais même si c'était laid :). En outre surcharger un opérateur existant pour un type arbitraire (s'il était même possible) révélerait un nouveau champ pour les collisions et les WTF inattendus.
Ajout de la méthode d'extension que vous avez utilisée dans votre exemple. Belle solution!
Aimer! Ajout de la méthode d'extension à notre bibliothèque-cadre également.
C # 6 contient quelque chose appelé le Opérateur de propagation NULL , ce qui signifie qu'il y a un soutien linguistique à cela. Votre exemple peut être écrit comme suit en C # 6: p> si l'une des pièces contient NULL, l'expression complète retournera NULL. P> Vous pouvez écrire quelque chose comme ceci: p> le moyen le plus simple d'implémenter ce mais de loin le moyen le plus cool de résoudre ce problème consiste à utiliser des arbres d'expression: p> C'est aussi le moyen le plus lent de faire des choses, Étant donné que chaque appel fera une ou plusieurs invocations de compilateur JIT, mais ... p> Il est toujours cool; -) p> p>
nullhelpers.getvalueornull code> est probablement quelque chose comme ceci: p> < pré> xxx pré>
Je ne pense pas que le deuxième exemple fonctionne ... ne devrait-il pas commencer à partir du bas de l'expression?
@Ak_: C'est ce que membres.Reverse (); code> est pour :-). Testez-le vous-même.
En mai 2012, lorsque vous avez posé la question, je n'ai pas vu une solution plus simple que l'essai ... Catch Vous avez fourni. La seule alternative - vérifier chaque partie contre NULL avec "si" ou "?" avait l'air plus laid (mais est peut-être un peu plus rapide).
Soit vous deviez écrire: p> ou: p> Mise à jour (décembre 2017): strong>
Depuis qui fait exactement la Idem et est imho beaucoup plus que le sucre syntaxiste "juste". Combiné avec un ceci fait la trajectoire code> variable vide si aucune valeur non nulle ne peut être obtenue. p> p>
Elvis code> -Opérator (également appelé opérateur null-coalescent
?. Code > et
x? [i] code> pour les tableaux), que vous pouvez utiliser. L'exemple ci-dessus p>
?? Valeur code> Vous pouvez facilement remplacer
null code> par une autre valeur, par exemple p>
J'ai mal lu et supprimé le commentaire