Nei linguaggi funzionali c'è spesso un monad Maybe
che consente di concatenare più chiamate su un oggetto e restituire l'intera espressione None
/null
se nessuna parte della catena restituisce nulla, piuttosto che il tipico NullReferenceException
che si ottiene C# concatenando le chiamate in cui un oggetto potrebbe essere nullo.Un operatore di de-riferimento condizionale sarebbe una buona cosa in C#?
Questo può essere banalmente implementato crei una Maybe<T>
con alcuni metodi di estensione per consentire comportamento simile in C# utilizzando comprehensions query, che può essere utile quando si elaborano XML con elementi facoltativi/attributi esempio
var val = from foo in doc.Elements("foo").FirstOrDefault().ToMaybe()
from bar in foo.Attribute("bar").ToMaybe()
select bar.Value;
Ma questa sintassi è un po 'goffo e poco intuitivo come le persone sono abituate a trattare con le sequenze in LINQ, piuttosto che singoli elementi, e ti lascia con un Maybe<T>
piuttosto che un T
alla fine. Un operatore di de-riferimento condizionale (ad es. ..
) sarebbe sufficientemente utile per farlo entrare nella lingua? per esempio.
var val = doc.Elements("foo").FirstOrDefault()..Attribute("bar")..Value;
Il condizionale de-riferimento si espanderebbe a qualcosa di simile:
object val;
var foo = doc.Elements("foo").FirstOrDefault();
if (foo != null)
{
var bar = foo.Attribute("bar");
if (bar != null)
{
val = bar.Value;
}
else
{
val = null;
}
}
posso vedere che questo potrebbe potenzialmente portare a terribili abusi come l'utilizzo di ..
ovunque per evitare una NullReferenceException
, ma d'altra parte se usato correttamente potrebbe essere molto utile in diverse situazioni. Pensieri?
Mi piace l'idea, molto. Suggerisco caldamente di usare qualcos'altro thean '..'. Forse '??.'. In ogni caso, qualcosa che non è un singolo errore di battitura lontano da '.'. –