在函數式語言中,通常會有一個Maybe
monad,它允許您將多個調用鏈接到一個對象上,並且如果鏈的任何部分評估爲無,則整個表達式將返回None
/null
,而不是您獲得的典型NullReferenceException
C#通過鏈接調用,其中一個對象可以爲null。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
,但另一方面如果使用得當,在不少情況下可能會非常方便。思考?
我喜歡這個主意,很多。我強烈建議使用其他的````。也許`??。`。無論如何,與```不同的是,這不是一個常見的錯字。 – 2013-10-03 15:55:12