En idiomas funcionales a menudo existe una mónada Maybe
que le permite encadenar múltiples llamadas en un objeto y devolver toda la expresión None
/null
si cualquier parte de la cadena se evalúa a nada, en lugar de la típica NullReferenceException
que obtendría en C# encadenando llamadas donde un objeto podría ser nulo.¿Sería bueno un operador de referencia condicional en C#?
Esto se puede implementar de manera trivial escribiendo un Maybe<T>
con algunos métodos de extensión para permitir un comportamiento similar en C# usando comprensiones de consulta, que pueden ser útiles al procesar XML con elementos/atributos opcionales.
var val = from foo in doc.Elements("foo").FirstOrDefault().ToMaybe()
from bar in foo.Attribute("bar").ToMaybe()
select bar.Value;
Pero esta sintaxis es un poco torpe y poco intuitivo que la gente está acostumbrada a tratar con secuencias en LINQ en lugar de elementos individuales, y que te deja con un Maybe<T>
en lugar de un T
al final. ¿Sería un operador de referencia condicional (por ejemplo, ..
) suficientemente útil para convertirlo en el idioma? p.ej.
var val = doc.Elements("foo").FirstOrDefault()..Attribute("bar")..Value;
El condicional de referencia se expandiría a algo como:
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;
}
}
puedo ver que esto podría conducir a terribles abusos como el uso de ..
todas partes para evitar una NullReferenceException
, pero por otra parte cuando se usa adecuadamente, puede ser muy útil en bastantes situaciones. ¿Pensamientos?
Me gusta la idea, mucho. Sugeriría usar algo diferente '' '. Quizás '??.'. En cualquier caso, algo que no sea un solo error común fuera de '.'. –