0
votes

Néater Way de définir l'une des deux variables à une certaine valeur basée sur un booléen?

J'ai remarqué que j'utilise beaucoup ce modèle dans mon code C #. (C'est dans un script d'unité, si cela compte.)

if (someBoolean) { firstVar = 10; } else { secondVar = 10; }


5 commentaires

Si vous étiez en C ou C ++, vous pourriez empêcher ce code avec un ternaire renvoyant l'adresse de l'une des deux variables, que vous pourriez la déréférence et l'utilisation comme une lvalue. Quant à C #, écrivez simplement le si / sinon. Ce n'est pas "Icky", c'est lisible.


Vous pouvez même vous débarrasser des accolades dans votre dernier exemple.


(quelque part? (action ) (n => firstvar = n): n => secondvar = n) (10); (Remarque: cette suggestion est uniquement à des fins de divertissement).


Je vois ... Eh bien, si / sinon est la voie à suivre, je suppose que je devrais juste l'avaler. Ta.


Gah! Je me suis senti inspiré de la réponse de Sach et je suis allé faire une réponse à poster. J'aurais dû rétracté mon vote étroit. Oh bien, je vais partager ce que j'ai fait ici. DotNetFiddle.net/d2qjjp


3 Réponses :


0
votes

S'il s'agit d'un événement fréquent, vous pouvez également utiliser des méthodes d'extension.

class Program
{
    static void Main(string[] args)
    {
        var firstVar = 1;
        var secondVar = 2;

        true.SetValue(ref firstVar, ref secondVar);
        false.SetValue(ref secondVar, ref secondVar);

        Console.Read();
    }
}

public static class BoolExtensions
{
    public static void SetValue(this bool bVal, ref int first, ref int second)
    {
        if (bVal)
            first = 10;
        else
            second = 10;
    }
}


5 commentaires

Je dois être honnête, je n'aime vraiment pas cette solution


@ MacCettura assez juste. Moi aussi, je voudrais simplement écrire simplement si-ele mais op ne semble pas les aimer. Et cela fonctionne. :)


J'ai peur que cela ne fonctionne pas dans mon cas. Comme mentionné, j'ai répété le motif, mais les opérations que j'ai effectuées sont souvent totalement différentes. Il y a le réglage, l'ajout, l'inversion, la concaténation, la sous-cordage, etc., etc. Cela fonctionnerait certainement si je répète le modèle et opération. Merci pour la suggestion!


@Nicolaskarayakaylar Vous pouvez écrire un ensemble de différentes méthodes d'extension pour chaque opération. Mais je pense que vous êtes vraiment inspiré d'un non-problème. Si / else Les déclarations sont parfaitement lisibles et pas trop de travail.


Oui je suis d'accord. Je vais rester avec si / sinon. Merci!



2
votes

Utilisez simplement si / sinon. Vous - par lequel je veux dire, je suis / je le dépassais.


0 commentaires

1
votes

Vous pouvez utiliser Destructuration Affectation (C # 7) pour en faire une déclaration unique: xxx pré>

s'il est plus expressif que le simple si code> est en train de débattre, mais cela donne vous une déclaration unique au moins. Peut être une bonne option si le reste du projet utilise activement des caractéristiques "destruct" et de nouvelles fonctionnalités C # 7+. P>

contrairement à Suggestion d'utiliser une fonction d'assistance avec Réf code> Arguments Destruction peut être utilisé pour des tableaux, des listes et des propriétés: P>

(list[0], list[1]) = someBoolean  ? (list[0], 10) : (10, list[1]);
(x.SomeProp, x.OtherProp) = someBoolean  ? (x.SomeProp, 10) : (10, x.OtherProp);


0 commentaires