Frage

Kann ich in c# so etwas in Kurzschrift machen?

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

Ich habe mich nur gefragt, ob etwas Ähnliches funktionieren würde, aber in genau diesem Szenario weiß ich, dass Sie Werte zuweisen können, wenn ich name = validName ?„Daniel“:„Nicht gültig“, aber ich habe mich nur gefragt, ob ich das Folgende tun kann?

     validName ? 
     {
         name = "Daniel";
         surname = "Smith";
     } 
     : 
     {
         MessageBox.Show("Invalid name");
     }
War es hilfreich?

Lösung

Missbrauch der Lambda-Syntax und Typinferenz:

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

Ich weiß, keine wirkliche Antwort.Wenn die Aussage viel besser ist:Offensichtlich ist diese Syntax weniger lesbar und, was noch wichtiger ist, sie weist ein anderes Laufzeitverhalten auf und könnte aufgrund möglicher Schließungen, die durch die Lambda-Ausdrücke verursacht werden, zu unbeabsichtigten Nebenwirkungen führen.

Auch die Syntax ist etwas kryptisch.Es werden zunächst zwei erstellt Action Objekte dann ?: Der Bediener wählt zwischen ihnen und schließlich wird das gewählte Ergebnis ausgeführt:

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

Action resultingAction = test_variable ? a1 : a2;

resultingAction();

Ich habe es in einer Anweisung zusammengefasst, indem ich die resultierende Aktion direkt ausgeführt habe.Um es noch kürzer zu machen, habe ich den ersten Lambda-Ausdruck in ein umgewandelt Action (anstatt eine zu erstellen new Action() explizit) und unter Ausnutzung der Typinferenz habe ich die zweite Umwandlung weggelassen.

Andere Tipps

Nehmen wir an, Sie könnten das tun.Warum?

Was ist die Motivation?

Weniger Linien?nicht genug, um einen Unterschied zu machen. Performance?Keiner, der Compiler wird für Sie umgehen. Klarheit?Wenn / sonst klarer und leichter von der Mehrheit der Entwickler verstanden wird.

Ich bin sicher, wenn Sie hart genug gearbeitet haben, können Sie einen Weg finden, um dies zu handhaben (höchstwahrscheinlich ein KLUDGE), aber ich kann immer noch nicht feststellen, warum.

nein.

Der ternäre Betreiber (? :) muss insgesamt ein Ausdruck sein - das ist etwas, das etwas zugeordnet werden kann.

Der bedingte Bediener erfordert seinen zweiten und dritten Operand, um Ausdrücke zu sein, die einen Wert zurückgeben (zusätzlich zur Erfüllung einiger Typeinschränkungen) und keine Anweisungen, die nicht auf einen Wert auflösen.Sie haben keinen Wert, den Sie von beiden Operationen zurückkehren möchten, die Sie gerade ausführen.

Sie könnten einen einigen unsinnigen Wert zurückgeben, um den Code kompilieren zu lassen, aber an diesem Punkt fügen Sie an diesem Punkt eine Tonne mehr Arbeit hinzu als nur mit einem generationalen semantischen Bediener für Ihre Anforderungen, alsoTechnisch möglich, es ist keine gute Idee.

generasacodicetagpre.

Da alle anderen wahrscheinlich gesagt haben, dass es etwas ist, das Sie wahrscheinlich nicht wirklich tun wollen, aber es ist möglich: p

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top