webentwicklung-frage-antwort-db.com.de

: ?? Operatoren anstelle von IF | ELSE

public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

Kann ich benutzen ?:?? Operatoren GENAU als ob/sonst?


Meine Frage:
Wie schreibe ich mit?: ?? Betreiber

[1]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[2]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

Kurz: Wie mache ich nichts, gebe nichts zurück und mache mehrere Anweisungen mit ?:?? Operator?

82
Ahmed Ghoneim

Bei [1] ist dies nicht möglich: Diese Operatoren geben einen Wert zurück und führen keine Operationen aus.

Der Ausdruck

a ? b : c

wird zu b ausgewertet, wenn a wahr ist, und wird zu c ausgewertet, wenn a falsch ist.

Der Ausdruck

b ?? c

wird zu b ausgewertet, wenn b nicht null ist, und wird zu c ausgewertet, wenn b null ist.

Wenn du schreibst

return a ? b : c;

oder

return b ?? c;

sie werden immer etwas zurückgeben.

Für [2] können Sie eine Funktion schreiben, die den richtigen Wert zurückgibt, der Ihre "Mehrfachoperationen" ausführt, aber das ist wahrscheinlich schlimmer als nur die Verwendung von if/else.

189
trutheality

Der ternäre Operator (?:) ist nicht für Kontrollfluss vorgesehen, sondern nur für bedingte Zuweisung. Wenn Sie den Programmfluss steuern müssen, verwenden Sie eine Kontrollstruktur, z. B. if/else.

41

Unter Bezugnahme auf ?: Operator (C # -Referenz)

Der bedingte Operator (? :) gibt abhängig vom Wert eines Booleschen Ausdrucks einen von zwei Werten zurück. Es folgt die Syntax für den bedingten Operator.

Unter Bezugnahme auf ?? Operator (C # -Referenz)

Das ?? Der Operator wird als Null-Koaleszenz-Operator bezeichnet und wird zum Definieren eines Standardwerts für nullfähige Werttypen sowie für Referenztypen verwendet. Es gibt den linken Operanden zurück, wenn er nicht null ist. Andernfalls wird der richtige Operand zurückgegeben.

Das bedeutet:

[Teil 1]

return source ?? String.Empty;

[Teil 2] ist nicht anwendbar ...

11
Akram Shahda

Das "Nichts tun" funktioniert nicht wirklich?

if by // Return Nothing du meinst eigentlich return null dann schreibe

return Source;

wenn Sie meinen, ignorieren Sie den Codepfad und schreiben Sie

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

Und zum letzten

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.
3
Vinnyq12

Der ternäre Operator gibt einen von zwei Werten zurück. Oder es kann je nach Zustand eine von zwei Anweisungen ausführen, was jedoch im Allgemeinen keine gute Idee ist, da dies zu unbeabsichtigten Nebenwirkungen führen kann.

bar ? () : baz();

In diesem Fall tut das () nichts, während baz etwas tut. Aber Sie haben nur den Code weniger klar gemacht. Ich würde mich für ausführlicheren Code entscheiden, der klarer und leichter zu pflegen ist.

Darüber hinaus macht dies überhaupt keinen Sinn:

var foo = bar ? () : baz();

since () hat keinen Rückgabetyp (es ist ungültig) und baz hat einen Rückgabetyp, der zum Zeitpunkt des Aufrufs in diesem Beispiel unbekannt ist. Wenn sie nicht einverstanden sind, beschwert sich der Compiler lautstark.

3
Mike Hofer

Wenn Sie mit der Ausführlichkeit Ihres Codes befasst sind, würde ich dies schreiben, anstatt zu versuchen, Ausdrücke zu missbrauchen.

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");
2
ChaosPandion

das?: ist der Reiseveranstalter. (glaube, ich habe das richtig geschrieben) und es ist einfach zu bedienen. wie in einem Booleschen Prädikat? iftrue: ifalse; Aber Sie müssen einen rWert/lWert wie in rWert = Prädikat haben? iftrue: iffalse;

ex int i = x < 7 ? x : 7;

wenn x kleiner als 7 wäre, würde ich x zugewiesen bekommen, wenn nicht, wäre ich 7.

sie können es auch in einer Rückgabe verwenden, wie in return x < 7 ? x : 7;

wieder wie oben würde dies den gleichen Effekt haben.

so, Source = Source == value ? Source : string.Empty; Ich glaube, das ist es, was du zu erreichen versuchst.

1
johnathan

Das ?: Der Operator gibt abhängig vom Wert eines Booleschen Ausdrucks einen von zwei Werten zurück.

Condition-Expression ? Expression1 : Expression2

Finden Sie hier mehr auf ?: Operator, auch bekannt als Ternary Operator:

1
rudenaggar

Ich glaube nicht, dass Sie ein Operator sein können und es annehmen, um den einen oder anderen zurückzugeben. Es ist kein if else Anweisungsersatz, obwohl er in bestimmten Fällen dafür verwendet werden kann.

0
atbebtg