Domanda

in c # posso fare qualcosa del genere in una stenografia?

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

Mi stavo solo chiedendo se qualcosa di simile a questo funzionerebbe, ma in questo esatto scenario, so che puoi assegnare valori se ho fatto nome= ValidName?"Daniel": "Non valido", ma mi stavo solo chiedendo se posso fare il basso?

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

È stato utile?

Soluzione

Abusando la sintassi della lambda e il tipo di inferenza:

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

Lo so, non davvero una risposta.Se la dichiarazione è molto migliore: ovviamente questa sintassi è meno leggibile e ancora più importante ha un comportamento di runtime diverso e potrebbe portare a effetti collaterali involontaria a causa di potenziali chiusure create dalle espressioni lambda.

La sintassi è un po 'criptico anche.Prima crea due oggetti Action, quindi ?: Operator sceglie tra di loro e finalmente viene eseguito il risultato scelto:

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

Action resultingAction = test_variable ? a1 : a2;

resultingAction();
.

L'ho messo insieme in una dichiarazione eseguendo l'azione risultante in posizione.Per renderlo ancora più breve, ho lanciato la prima espressione di lambda in un Action (invece di creare un new Action() esplicitamente) e sfruttare il vantaggio dell'inferenza di tipo ho lasciato fuori il secondo cast.

Altri suggerimenti

Diciamo che potresti farlo.Perché?

Qual è la motivazione?

meno linee?non abbastanza per fare la differenza. Prestazione?Nessuno, il compilatore gestirà le cose per te. Chiarezza?Se / altro è più chiaro e più facilmente compreso dalla maggior parte degli sviluppatori.

Sono sicuro, se hai lavorato abbastanza duramente, potresti trovare un modo per gestire questo (molto probabilmente un klusco), ma non riesco ancora a determinare il perché.

no.

L'operatore ternario (? :) deve essere, nel suo insieme, un'espressione - cioè qualcosa che può essere assegnato a qualcosa.

L'operatore condizionale richiede che il suo secondo e il terzo operando siano espressioni che restituiscano un valore (oltre a soddisfare alcune restrizioni di tipo) e non dichiarazioni che non si risolvono in un valore.Non hai valore che desideri tornare da entrambe le operazioni che si sta attualmente eseguendo.

Potresti restituire un valore nonsensico solo per il bene di realizzare la compilazione del codice, ma a quel punto stai aggiungendo un lavoro più un lavoro rispetto a un semplice utilizzo di un if che è il corretto operatore semantico per i tuoi requisiti, così mentre èTecnicamente possibile, non è una buona idea.

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;
}
.

Come tutti gli altri hanno probabilmente detto che è qualcosa che probabilmente non vorresti davvero fare, ma è possibile: P

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top