40 votes

Existe-t-il un meilleur moyen d’exprimer un lambda sans paramètre que () =>?

Le () semble idiot. Y a-t-il un meilleur moyen?

Par exemple:

ExternalId.IfNotNullDo(() => ExternalId = ExternalId.Trim());

44voto

Charlie Flowers Points 9145

Sorte de! Il y a un nouvel idiome de la ville, qui est agréable et peut vous aider dans certains cas. Il n'est pas tout ce que vous voulez, mais parfois je pense que vous allez aimer.

Depuis le trait de soulignement ("_") est valide en C# identifiant, il est en train de devenir une commune de l'idiome de l'utiliser comme un nom de paramètre à un lambda dans le cas où vous avez l'intention d'ignorer le paramètre de toute façon. Si d'autres programmeurs sont conscients de l'idiome, ils sauront immédiatement que le paramètre n'est pas pertinent.

Par exemple:

ExternalId.IfNotNullDo( _ => ExternalId=ExternalId.Trim());

Facile à taper, transmet votre intention, et plus facile sur les yeux ainsi.

Bien sûr, si vous êtes de passage de votre lambda à quelque chose qui s'attend à une arborescence d'expression, cela peut ne pas fonctionner, parce que maintenant vous êtes en passant un paramètre lambda au lieu d'un paramètre lambda.

Mais pour de nombreux cas, c'est une solution sympa. Vous pouvez en savoir plus à ce sujet ici.

24voto

Marc Gravell Points 482669

Pour un lambda, non: vous avez besoin de () =>

Est-ce pour un délégué ou une expression? Pour les délégués, une autre option est delegate {...} . Cela peut être souhaitable ou non, selon le scénario. C'est plus de clés, certainement ...

Dans certains cas (pas celui-ci), vous pouvez utiliser directement une méthode cible - c'est-à-dire

 ExternalId.IfNotNullDo(SomeMethod);
 

19voto

Jon Skeet Points 692016

Non, il n'y en a pas. Les expressions Lambda sont optimisées (en termes de syntaxe) pour la casse à paramètre unique.

Je sais que l’équipe C # ressent votre douleur et a essayé de trouver une alternative. Qu'il y en ait un ou pas, c'est une autre affaire.

-1voto

Ruben Bartelink Points 23945

Essentiellement, ce que vous cherchez est l'inverse de l' ?? null coalescence opérateur (ce qui est appelé Nullable<T>.GetValueOrDefault() sous les couvertures) - problème est le C# n'est pas un pur OOTB réponse.

Ne sais pas exactement ce que vous faites, mais comme vous le faites:

ExternalId.IfNotNullDo(()=>ExternalId=ExternalId.Trim());

vous pouvez également trouver une utilisation pour:

class NullExtensions
{
    public T DefaultOr<T>( this T that, Func<T> transform)
    {
        return that!=default(T) ? transform(that) : default(T);
    }
}

ce qui permettrait de:

var result = input.DefaultOr( _ => _.Trim());

(en général, je serais en essayant de tenir à l'écart de réutiliser et de la mutation des variables comme vous semblez le faire, et au lieu d'aller dans un Introduire Expliquant Variable / Split Variable Temporaire direction c'est à dire, utiliser une nouvelle variable plutôt que d' value = value.DefaultOr( _ => _.Trim());)

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