59 votes

C # expression si-null-then-null

Juste pour la curiosité/confort d'utilisation: C# fournit deux cool expression conditionnelle fonctionnalités que je connais:

string trimmed = (input == null) ? null : input.Trim();

et

string trimmed = (input ?? "").Trim();

J'ai manquer une telle expression d'une situation, j'ai le visage très souvent:

Si l'entrée de référence est null, le résultat doit être null. Autrement, la sortie doit être l'aboutissement de l'accès à une méthode ou une propriété de l'objet d'entrée.

J'ai fait exactement ça dans mon premier exemple, mais (input == null) ? null : input.Trim() est assez verbeux et illisible.

Est-il une autre expression conditionnelle pour ce cas, ou puis-je utiliser l' ?? de l'opérateur de façon élégante?

51voto

Jon Skeet Points 692016

Quelque chose comme Groovy null sûr référence à l'opérateur?

string zipCode = customer?.Address?.ZipCode;

Je suppose que l'équipe C# a regardé ça et trouve qu'elle n'est pas aussi simple pour la conception élégante comme on pourrait s'y attendre... même si je n'ai pas entendu parler sur les détails des problèmes.

Je ne crois pas qu'il y a quelque chose dans la langue en ce moment, j'ai peur... et je n'ai pas entendu parler de plans pour elle, bien que cela ne veut pas dire qu'il n'arrivera pas à un certain point.

EDIT: Il va maintenant faire partie de C# 6, en tant que "nul conditionnel de l'opérateur".

10voto

Danny Chen Points 14781

Actuellement, nous ne pouvons écrire une méthode d'extension que si vous ne voulez pas vous répéter, j'en ai bien peur.

 public static string NullableTrim(this string s)
{
   return s == null ? null : s.Trim();
}
 

10voto

naiem Points 81

Vous pouvez choisir entre une méthode personnalisée Nullify classe ou une méthode d'extension NullSafe telle que décrite ici: http://qualityofdata.com/2011/01/27/nullsafe-dereference-operator-in -c /

L'utilisation sera comme suit:

 //Groovy:
bossName = Employee?.Supervisor?.Manager?.Boss?.Name

//C# Option 1:
bossName = Nullify.Get(Employee, e => e.Supervisor, s => s.Manager,
                       m => m.Boss, b => b.Name);
//C# Option 2:
bossName = Employee.NullSafe( e => e.Supervisor ).NullSafe( s => s.Boss )
                      .NullSafe( b => b.Name );
 

8voto

QrystaL Points 2606

Comme solution de contournement, vous pouvez utiliser ceci qui est basé sur Maybe Monad .

 public static Tout IfNotNull<Tin, Tout>(this Tin instance, Func<Tin, Tout> Output)
{
    if (instance == null)
        return default(Tout);
    else
        return Output(instance);
}
 

Utilisez-le de cette façon:

 int result = objectInstance.IfNotNull(r => 5);
var result = objectInstance.IfNotNull(r => r.DoSomething());
 

6voto

LukeH Points 110965

Il n'y a rien d'intégré, mais vous pouvez tout inclure dans une méthode d'extension si vous le souhaitez (bien que cela ne me dérangerait probablement pas).

Pour cet exemple spécifique:

 string trimmed = input.NullSafeTrim();

// ...

public static class StringExtensions
{
    public static string NullSafeTrim(this string source)
    {
        if (source == null)
            return source;    // or return an empty string if you prefer

        return source.Trim();
    }
}
 

Ou une version plus générale:

 string trimmed = input.IfNotNull(s => s.Trim());

// ...

public static class YourExtensions
{
    public static TResult IfNotNull<TSource, TResult>(
        this TSource source, Func<TSource, TResult> func)
    {
        if (func == null)
            throw new ArgumentNullException("func");

        if (source == null)
            return source;

        return func(source);
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X