Si basa su di un && corto circuito sicuro in .NET?

Assumere myObj è null. È sicuro di scrivere questo?

if(myObj != null && myObj.SomeString != null)

So che alcune lingue non eseguire la seconda espressione, perché il && restituisce false prima della seconda parte viene eseguita.

InformationsquelleAutor astronought | 2011-01-27



9 Replies
  1. 80

    Sì. In C# && e || sono cortocircuiti e, quindi, valuta la destra solo se la sinistra non già determinare il risultato. Gli operatori & e | d’altra parte non di corto circuito e di valutare sempre entrambi i lati.

    Spec dice:

    Il && e || gli operatori sono chiamati il condizionale operatori logici. Essi sono anche chiamati “corto circuito” operatori logici.



    L’operazione x && y corrisponde all’operazione di x & y, tranne che y è valutato solo se x è true



    L’operazione x && y è valutato come (bool)x ? (bool)y : false. In altre parole, x viene prima valutato e convertito tipo bool. Quindi, se x è true, y è valutato e convertito tipo bool, e questo diventa il risultato dell’operazione. In caso contrario, il risultato dell’operazione è false.

    (Specifica del Linguaggio C# Versione 4.0 – 7.12 Condizionale operatori logici)

    Una interessante proprietà di && e || è che sono in corto, anche se essi non operano sulla bools, ma i tipi in cui l’utente overload degli operatori & o | insieme con il true e false operatore.

    L’operazione x && y è valutato come T.false((T)x) ? (T)x : T.&((T)x, y), dove
    T.false((T)x) è un’invocazione della operator false dichiarato in T, e T.&((T)x, y) è una invocazione selezionato operator &. Inoltre, il valore (T)x deve essere valutata solo una volta.

    In altre parole, x viene prima valutato e convertito tipo T e operator false viene invocato il risultato per determinare se x è sicuramente false.

    Quindi, se x è sicuramente false, il risultato dell’operazione è il valore precedentemente calcolato per x convertito tipo T.

    In caso contrario, y è valutato, e l’operatore selezionato & viene richiamato il valore precedentemente calcolato per x convertito tipo T e il valore calcolato per y per produrre il risultato dell’operazione.

    (Specifica del Linguaggio C# Versione 4.0 – 7.12.2 definito dall’Utente condizionale operatori logici)

    • Quest’ultimo paragrafo è un po ‘ anche interessante…ha reso la mia testa fa male. 🙂
    • Sembra complicato, ma non è così difficile. Semplicemente non valutare il lato destro se la false operatore sul lato sinistro restituisce true e restituisce lato sinistro, invece, e altro richiama l’usanza & operatore. Così, imitando il corto circuito comportamento bools. L’applicazione tipica di questo è un esteso bool che può avere uno stato terzo. Per esempio si potrebbe implementare qualcosa di simile a DBBol o bool? con che.
  2. 14

    Sì, C# utilizza logiche di corto circuito.

    Notare che anche se il C# (e di alcuni altri .NET languages) si comportano in questo modo, ma è una proprietà di linguaggio che non CLR.

    • In realtà, VB.NET si comporta in questo modo quando si utilizza AndAlso e OrElse, non And e Or, il che è probabile che il 90% delle persone usa sempre.
    • È anche importante notare che questo non è solo un dettaglio di implementazione (che può cambiare in qualsiasi momento), ma una parte di C# Specifica (che non modifica in questo senso).
  3. 4

    Il tuo codice in modo sicuro, && e || sono entrambi in corto circuito. È possibile utilizzare non in corto circuito gli operatori & o |, per valutare entrambe le estremità, ma io davvero non vedere che in gran parte il codice di produzione.

  4. 2

    sicuro, è sicuro in C#, se il primo operando è false, il secondo non è mai valutato.

    • Se tu fossi una delle “belle persone”, forse qualcuno dovrebbe votare la tua risposta.
    • La tua risposta è corretta, ma non molto particolare come CodesInChaos
  5. 0

    È perfettamente sicuro. C# è uno di quei linguaggi.

    • Uno di quei linguaggi che utilizza valutazione di corto circuito qui
    • la domanda dice “so che alcune lingue…”
    • Kogan: immagino che significa che devo leggere la questione più da vicino 😉
  6. 0

    Sì, C# e la maggior parte delle lingue calcolare la se frasi da sinistra a destra.

    VB6 dal modo in cui si calcola il tutto, e lanciare un’eccezione se è null…

    • Questo non è proprio sbagliato, ma è fuorviante su così tanti livelli. (1) tra parentesi graffe lingue è solo un piccolo sottoinsieme delle lingue che fanno questo. (2) Invertendo l’ingresso prima dell’analisi è una follia, dunque, in una lingua non fa questo. (3) a Prescindere da come si è letto, a breve curcuiting runtime di semantica. (4) si Veda il commento di harpo la risposta per quanto riguarda VB – And non breve curcuit, ma & non sia. (Forse 2+3 sono perché si confondono con l’analisi di qualcosa che avviene a runtime…)
    • sì, ment “calcola” analizza… modificare.
  7. 0

    un esempio è

    if(strString != null && strString.Length > 0)

    Questa linea potrebbe causare un’eccezione null se entrambi i lati eseguito.

    Collaterali degni di nota. L’esempio di cui sopra è un po ‘ più veloce di isnullorempty all’metodo.

  8. 0

    In C#, && e || sono in corto circuito, il che significa che la prima condizione viene valutata e il resto viene ignorato se la risposta è determinato.

    In VB.NET, AndAlso e OrElse sono in corto circuito.

    In javaScript, && e || sono in cortocircuito troppo.

    Ho citato VB.NET per dimostrare che il brutto red-headed passo-figlio di .net ha anche cose interessanti, troppo, a volte.

    Cito javaScript, perché se si sta facendo di sviluppo web, allora probabilmente si potrebbe anche usare javaScript.

Lascia un commento