我个人喜欢通过使用选项类型来完全避免此问题。通过将这些方法/属性返回的值调整为
Option<T>而不是
T,调用者可以选择他们希望如何处理无值的情况。
选项类型可以包含一个值,也可以不包含(但是选项本身永远不能为null),但是调用者不能简单地传递它而不解开值,因此它迫使调用者处理可能没有值的事实。
例如在C#中:
class A { Option<B> B { get { return this.optB; } }}class B { Option<C> C { get { return this.optC; } }}// and so on
如果调用者想抛出该异常,则它们仅检索该值,而无需显式检查是否存在一个值:
A a = GetOne();D d = a.Value.B.Value.C.Value.D.Value; // Value() will throw if there is no value
如果调用方只想默认没有任何步骤的值,则可以执行映射/绑定/投影:
A a = GetOne();D d = a.Convert(a => a.B) // gives the value or empty Option<B> .Convert(b => b.C) // gives value or empty Option<C> .Convert(c => c.D) // gives value or empty Option<D> .ValueOrDefault(new D("No value")); // get a default if anything was empty
如果呼叫者想在每个阶段默认,则他们可以:
A a = GetOne();D d = a.ValueOrDefault(defaultA) .B.ValueOrDefault(defaultB) .C.ValueOrDefault(defaultC) .D.ValueOrDefault(defaultD);
Option目前不是C#的一部分,但我想会有一天。您可以通过引用F#库来获得实现,或者可以在Web上找到实现。如果您想要我的,请告诉我,我会把它发送给您。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)