2012-05-09 17 views
10

Eventuali duplicati:
Why are there no ||= or &&= operators?&& = in C#? (Espressione booleana)

per puro caso ho scoperto oggi che

a &= GetBool(); 

non è lo stesso di

a = a && GetBool(); 

Devo aver frainteso quello per anni. Nel primo esempio, "GetBool()" viene eseguito anche se "a" è falso. Nel secondo, non lo è.

C'è qualcosa per ottenere qualcosa come "& & =" in C#?

+1

'a & = a? getBool(): true; ' –

+3

@Soohjun: dovrebbe essere' false' invece di 'true'. – leppie

+5

Credo che Eric abbia bloggato sul perché '&& =' non è disponibile ..... Ahh eccolo http://blogs.msdn.com/b/ericlippert/archive/2012/04/19/null-is-not -false-part-three.aspx – V4Vendetta

risposta

4

Dal documentation:

Un'espressione usando l'operatore & = assegnazione, come

x & = y

è equivalente a

x = x & y

eccetto che x viene valutato solo una volta. L'operatore & esegue un'operazione AND logica bit a bit su operandi integrali e AND logici su operandi bool .

direi, per evitare la valutazione di y quando non è necessario, utilizzare

x = x && y 

ed evitare la valutazione di x due volte (qualunque cosa ciò significhi), utilizzare

x &= y 

Puoi combinare entrambi.

Micro-ottimizzato (almeno per un caso teorico), sarebbe:

if (x) x = y; 

Non c'è bisogno di fare nulla se x è già false.

+3

"valutato una volta" è inteso per casi più complessi, ad esempio se si ha 'x [i + 3] = x [i + 3] & y;' Quindi 'i + 3' viene calcolato due volte, ovviamente! –

+0

@ Mr Lister: questo ha senso, non l'ho considerato. Ci sono anche proprietà, dove puoi usare l'operatore & =, che può avere un'implementazione complessa arbitraria (se questo è un buon progetto a parte). –

6

C'è qualcosa per ottenere qualcosa come "& & =" in C#?

Beh, è ​​possibile scrivere

a = a && getBool(); 

invece ... non riesco a pensare a molte situazioni in cui mi piacerebbe davvero voglio di fare qualcosa di diverso, ad essere onesti. Anche quanto sopra è piuttosto raro, IME.

Non esiste un operatore di assegnazione composto definito per &&, || o ?? (che sono gli ovvi operatori di "cortocircuito"). Vedere la sezione 7.17 della specifica C# 4 per l'elenco completo degli operatori di assegnazione composti e la sezione 7.17.2 per ulteriori dettagli su cosa sia esattamente l'assegnazione composta .