Null-coalescenza operatore e l'operatore && in C #
-
02-10-2019 - |
Domanda
E 'possibile utilizzare insieme qualsiasi ??
operatore di strada e operatore &&
in caso successivo:
bool? Any
{
get
{
var any = this.ViewState["any"] as bool?;
return any.HasValue ? any.Value && this.SomeBool : any;
}
}
prossimi Ciò significa che:
- se
any
è nullo allorathis.Any.HasValue
false
ritorno - se
any
ha valore, allora restituisce il valore considerando un'altra proprietà booleana, vale a direAny && SomeBool
Soluzione
Mi chiedo come mai nessuno ha suggerito questo finora:
bool? any = this.ViewState["any"] as bool?;
return any & this.SomeBool;
Questo restituisce
-
null
seany
è nullo, non importa quale sia il valore dithis.SomeBool
è; -
true
se entrambiany
ethis.SomeBool
sono vere; e -
false
seany
non è nullo, ethis.SomeBool
è falso.
Altri suggerimenti
Dal momento che si desidera tornare null
nel caso in cui la sorgente è null
, non credo ??
sta andando per aiutarti a scrivere questo qualsiasi più breve o più chiara.
E 'questo che vuoi dire?
bool? Any
{
get
{
return ((this.ViewState["any"] as bool?) ?? false) && this.SomeBool;
}
}
Ho lasciato il valore restituito come bool? ma sembra che potrebbe essere cambiato solo bool.
Questo è stato testato in questo modo:
class Program
{
private static readonly Dictionary<string, object> ViewState = new Dictionary<string, object>();
private static bool SomeBool;
static void Main(string[] args)
{
ViewState["any"] = (bool?)null; SomeBool = true; Console.WriteLine(Any);
ViewState["any"] = (bool?)false; SomeBool = true; Console.WriteLine(Any);
ViewState["any"] = (bool?)true; SomeBool = true; Console.WriteLine(Any);
ViewState["any"] = (bool?)null; SomeBool = false; Console.WriteLine(Any);
ViewState["any"] = (bool?)false; SomeBool = false; Console.WriteLine(Any);
ViewState["any"] = (bool?)true; SomeBool = false; Console.WriteLine(Any);
Console.ReadLine();
}
static bool? Any
{
get
{
return ((ViewState["any"] as bool?) ?? false) && SomeBool;
}
}
}
che ritorna
False
False
True
False
False
False
Il comportamento qui non è la stessa come l'originale nullo debba essere rinviato per casi di prova 1 e 4 siano identici. Ma forse non è richiesto un comportamento?
Credo che quello che si sta cercando di fare è questo:
return any ?? (any.Value && this.SomeBool) ? true : new Nullable<bool>();
Tuttavia, credo che in casi come questo, è probabilmente più chiaro utilizzare un blocco if:
if ( !any.HasValue )
return (any.Value && this.SomeBool) ? true : any;
else
return any;
Se uno è null
, poi si desidera tornare true
o null
, giusto?
L'operatore Null coalescenza non è andare a lavorare per come hai strutturato la logica per il metodo. Certo si potrebbe forzarlo in là, ma sta andando a guardare brutto e solo confondere chiunque lo legge.
Ho trovato il codice originale difficile da leggere e capire, quindi refactoring e rimosso l'operatore ternario per rivelare le intenzioni.
bool? any = this.ViewState["any"] as bool?;
if (any == null)
return null;
return any.Value && this.SomeBool;
Null coalescenza è solo bello stenografia e deve essere usata con giudizio
Person contact = Mother ?? Father ?? FirstSibling;
è più intenzione rivelare, e più facile da leggere + mantenere rispetto:
Person contact = Mother;
if (contact == null)
contact = Father;
if (contact == null)
contact = FirstSibling;
cosa è, non si vuole veramente utilizzare il ?? operatore. La sua pensati per rendere più facile evitare i valori nulli, in realtà si desidera mantenere i valori nulli.
Questo è il comportamento descritto:
return (any ?? false) && this.SomeBool