使用异常代替冗长的null检查是否可以接受?

使用异常代替冗长的null检查是否可以接受?,第1张

使用异常代替冗长的null检查是否可以接受?

我个人喜欢通过使用选项类型来完全避免此问题。通过将这些方法/属性返回的值调整为

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上找到实现。如果您想要我的,请告诉我,我会把它发送给您。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5487229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存