栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用异常代替冗长的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上找到实现。如果您想要我的,请告诉我,我会把它发送给您。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495107.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号