Question

En C#, puis-je faire quelque chose comme ça en raccourci ?

 bool validName = true;
 if (validName)
 {
     name = "Daniel";
     surname = "Smith";
 }
 else
 {
     MessageBox.Show("Invalid name");
 }

Je me demandais simplement si quelque chose de similaire fonctionnerait, mais dans ce scénario précis, je sais que vous pouvez attribuer des valeurs si je le faisais name = validName ?"Daniel" :"Non valide", mais je me demandais simplement si je pouvais faire ce qui suit ?

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
Était-ce utile?

La solution

Abuser de la syntaxe lambda et de l'inférence de type :

(validName
    ? (Action)
        (() =>
            {
                name = "Daniel";
                surname = "Smith";
            })
      : () =>
           {
                MessageBox.Show("Invalid name");
           })();

Je sais, pas vraiment une réponse.Si la déclaration est bien meilleure :évidemment, cette syntaxe est moins lisible et, plus important encore, elle a un comportement d'exécution différent et pourrait entraîner des effets secondaires involontaires en raison des fermetures potentielles créées par les expressions lambda.

La syntaxe est également un peu énigmatique.Il crée d'abord deux Action des objets alors ?: l'opérateur choisit entre eux et enfin le résultat choisi est exécuté :

var a1 = new Action(() => { /* if code block */ });
var a2 = new Action(() => { /* else code block */ });

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

Je l'ai rassemblé dans une seule instruction en exécutant l'action résultante sur place.Pour le rendre encore plus bref, j'ai jeté la première expression lambda dans un Action (au lieu de créer un new Action() explicitement) et profitant de l'inférence de type, j'ai laissé de côté le deuxième casting.

Autres conseils

Disons que vous pourriez le faire.Pourquoi?

Quelle est la motivation?

Moins de lignes?pas assez pour faire une différence. Performance?Aucun, le compilateur gérera les choses pour vous. Clarté?Si / sinon est plus clair et compris plus facilement par la majorité des développeurs.

Je suis sûr que si vous avez travaillé assez dur, vous pouvez trouver un moyen de gérer cela (probablement un kludge), mais je ne peux toujours pas déterminer le pourquoi.

NO.

L'opérateur ternaire (? :) doit être, dans son ensemble, une expression - c'est-à-dire quelque chose qui peut être attribué à quelque chose.

L'opérateur conditionnel nécessite que ses deuxième et troisième opérandes soient des expressions qui renvoient une valeur (en plus de répondre à certaines restrictions de type) et non des déclarations qui ne résolvent pas à une valeur.Vous n'avez aucune valeur que vous souhaitez revenir de l'une ou l'autre opération que vous effectuez actuellement.

Vous pouvez retourner une valeur absurde uniquement pour que le code compile, mais à ce stade, vous ajoutez une tonne plus de travail que d'utiliser un opérateur sémantique généreux qui correspond à vos besoins.Techniquement possible, ce n'est pas une bonne idée.

fullName = validName == true ? returnName(firstName)+" "+returnName(lastName) : validName == false ? invalidName("Invalid Name") : null


public string returnName(string name)
{
return name;
}

public string invalidName(string invalid)
{
MessageBox.Show(invalid);
return null;
}

Comme tout le monde a probablement dit que c'est quelque chose que vous ne voudrez probablement pas vraiment faire, mais cela est possible: p

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top