:? Operatory zamiast 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" );
    }
}

Czy mogę użyć ?: ?? operatory dokładnie jak gdyby / Else?


Moje Pytanie:
Jak napisać poniższy tekst ?: ?? operatory

[ 1 ]

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

[ 2 ]

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

Krótko: jak nic nie robić, nic nie zwracać i robić wiele instrukcji z ?: ?? centrala?

Author: Chris Stillwell, 2011-06-02

9 answers

Dla [1], nie można: operatory te mają zwracać wartość, a nie wykonywać operacje.

Wyrażenie

a ? b : c

Ocenia na b, Jeśli a jest prawdziwe, a ocenia na c, Jeśli a jest fałszywe.

Wyrażenie

b ?? c

Ocenia na b Jeśli b nie jest null i ocenia na c Jeśli b jest null.

Jeśli napiszesz

return a ? b : c;

Lub

return b ?? c;

Oni zawsze coś zwrócą.

Dla [2], można napisz funkcję, która zwraca odpowiednią wartość, która wykonuje twoje "wiele operacji" , ale to prawdopodobnie gorsze niż użycie if/else.

 161
Author: trutheality,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:53:34

Operator trójkowy (?:) nie jest przeznaczony do przepływu sterowania, jest przeznaczony tylko do przypisania warunkowego. Jeśli chcesz kontrolować przepływ swojego programu, użyj struktury sterowania, takiej jak if/else.

 39
Author: Oliver Charlesworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:45:05

Odnosi się do ?: Operator (C # Reference)

Operator warunkowy (?:) powroty jedną z dwóch wartości w zależności od wartość wyrażenia logicznego. Poniżej znajduje się składnia operator warunkowy.

Odnosi się do ?? Operator (C # Reference)

The ?? operatorem nazywa się null-operator koalescencyjny i jest używany aby zdefiniować wartość domyślną dla typy wartości nullable, jak również typy referencyjne. Zwraca operand po lewej stronie, jeśli nie jest null; w przeciwnym razie zwraca prawo operand.

To znaczy:

[Część 1]

return source ?? String.Empty;

[część 2] Nie dotyczy ...

 10
Author: Akram Shahda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:55:13

"nic nie robić" tak naprawdę nie działa ?

If by / / Return Nothing you actually mean return null then write

return Source;

Jeśli masz na myśli ignorowanie ścieżki kodowej to napisz

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

I do ostatniego

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

// nothing done.
 3
Author: Vinnyq12,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:45:39

Operator trójdzielny zwraca jedną z dwóch wartości. Albo może wykonać jedno z dwóch poleceń w oparciu o swój stan, ale generalnie nie jest to dobry pomysł, ponieważ może to prowadzić do niezamierzonych skutków ubocznych.

bar ? () : baz();

W tym przypadku () nic nie robi, podczas gdy baz coś robi. Ale tylko uczyniłeś kod mniej jasnym. Wybrałbym bardziej szczegółowy kod, który jest jaśniejszy i łatwiejszy w utrzymaniu.

Co więcej, nie ma to żadnego sensu:
var foo = bar ? () : baz();

Ponieważ () nie ma typu return (jest void) i baz ma typ powrotu, który jest nieznany w momencie wywołania w tej próbce. Jeśli się nie zgodzą, kompilator będzie narzekał i głośno.

 3
Author: Mike Hofer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:47:42

Jeśli interesuje Cię słowność Twojego kodu, napiszę to, zamiast próbować nadużywać wyrażeń.

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");
 2
Author: ChaosPandion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:46:31

The ?: jest operatorem trasy. (wierzę, że pisałem to poprawnie) i jest prosty w użyciu. Boolean predykat ? iftrue: ifalse; ale musisz mieć rvalue / lvalue jak w rvalue = predykat ? iftrue: iffalse;

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

Gdyby x było mniejsze niż 7, dostałbym przypisane x, jeśli nie byłbym 7.

Możesz również użyć go w zwrocie, jak w return x < 7 ? x : 7;

Ponownie, jak powyżej, miałoby to taki sam wpływ.

Więc, Source = Source == value ? Source : string.Empty; wierzę, że to jest to, co próbujesz / align = "left" /

 1
Author: johnathon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:44:45

Operator ?: zwraca jedną z dwóch wartości w zależności od wartości wyrażenia logicznego.

Condition-Expression ? Expression1 : Expression2

Znajdziesz tutaj więcej o operatorze ?:, znanym również jako Operator trójdzielny:

 1
Author: rudenaggar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 06:38:37

Nie sądzę, że można to operator i jego przypuszczać, aby zwrócić jeden lub drugi. Nie jest to zamiennik instrukcji if else, chociaż może być używany do tego w określonym przypadku.

 0
Author: atbebtg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:44:29