В функциональных языках часто встречается монада Maybe
, которая позволяет объединить несколько вызовов объекта и получить полное выражение, возвращающее None
/ null
, если какая-либо часть цепочки ничего не вычисляет, а не типичный NullReferenceException
вы бы получили в C # путем цепочки вызовов, где один объект может быть нулевым.
Это можно реализовать тривиально, написав Maybe<T>
с некоторыми методами расширения, чтобы разрешить подобное поведение в C # с использованием понимания запросов, что может быть полезно при обработке XML с дополнительными элементами / атрибутами, например,
var val = from foo in doc.Elements("foo").FirstOrDefault().ToMaybe()
from bar in foo.Attribute("bar").ToMaybe()
select bar.Value;
Но этот синтаксис немного неуклюж и не интуитивен, так как люди привыкли иметь дело с последовательностями в Linq, а не с отдельными элементами, и он оставляет вам Maybe<T>
вместо T
в конце. Будет ли условный оператор разыменования (например, ..
) достаточно полезным, чтобы перевести его на язык? например,
var val = doc.Elements("foo").FirstOrDefault()..Attribute("bar")..Value;
Условная де-ссылка расширилась бы до что-то вроде:
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;
}
}
Я вижу, что это может привести к ужасным злоупотреблениям, таким как использование ..
везде, чтобы избежать NullReferenceException
, но, с другой стороны, при правильном использовании это может быть очень удобно в довольно многих ситуациях. Мысли?