Dans les langages fonctionnels, il existe souvent une monade Maybe
qui vous permet d'enchaîner plusieurs appels sur un objet et de renvoyer l'expression entière None
/null
si une partie de la chaîne n'évalue rien, plutôt que les NullReferenceException
typiques que vous obtiendriez C# en enchaînant les appels où un objet pourrait être nul. Cela peut être implémenté de manière triviale en écrivant un Maybe<T>
avec des méthodes d'extension pour permettre un comportement similaire en C# en utilisant des requêtes compréhensibles, ce qui peut être utile lors du traitement de XML avec des éléments/attributs facultatifs, par ex.Est-ce qu'un opérateur conditionnel de référence est une bonne chose en C#?
var val = from foo in doc.Elements("foo").FirstOrDefault().ToMaybe()
from bar in foo.Attribute("bar").ToMaybe()
select bar.Value;
Mais cette syntaxe est un peu maladroit et peu intuitive que les gens sont habitués à traiter avec des séquences en Linq plutôt que des éléments simples, et il vous laisse avec un Maybe<T>
plutôt qu'un T
à la fin. Est-ce qu'un opérateur conditionnel de référence (par exemple ..
) être suffisamment utile pour en faire la langue? par exemple.
var val = doc.Elements("foo").FirstOrDefault()..Attribute("bar")..Value;
Le de référence conditionnelle se développerait à quelque chose comme:
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;
}
}
Je peux voir que cela pourrait conduire à des abus terribles comme l'utilisation ..
partout pour éviter une NullReferenceException
, mais d'autre part lorsqu'il est utilisé correctement, il pourrait être très utile dans un certain nombre de situations. Pensées?
J'aime l'idée, beaucoup. Je suggère fortement d'utiliser quelque chose d'autre. Peut-être '??.'. En tout cas, quelque chose qui n'est pas une faute de frappe commune loin de '.'. –