加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计 – 在调用C#代码时,在F#中进行大量空值检查的最佳方法是什

发布时间:2020-12-15 04:14:31 所属栏目:百科 来源:网络整理
导读:我想知道以功能方式与F#中的C#代码交互的最佳方式,当我必须多次检查null时. 从C#开始,很简单,因为我有空操作符 public bool Authorize(DashboardContext dashboardContext){ var context = new OwinContext(dashboardContext.GetOwinEnvironment()); var use
我想知道以功能方式与F#中的C#代码交互的最佳方式,当我必须多次检查null时.

从C#开始,很简单,因为我有空操作符

public bool Authorize(DashboardContext dashboardContext)
{
    var context = new OwinContext(dashboardContext.GetOwinEnvironment());
    var user = context.Authentication.User;
    return user?.Identity?.IsAuthenticated ?? false;
}

从F#开始,我做到了这一点

let authorize (ctx:DashboardContext) =
    match OwinContext(ctx.GetOwinEnvironment()) with
    | null -> false
    | c -> match c.Authentication.User with
            | null -> false
            | user -> user.Identity.IsAuthenticated

但我对此并不满意.这样做的功能方法是什么?我想也许一些计算表达式会有所帮助,但我不知道如何完成.

解决方法

Option.ofObj将可空对象转换为Option.然后,您可以使用已在Option模块中定义的帮助程序.例如,您在那里编写的部分模式已经被Option.bind封装.
let authorize (ctx:DashboardContext) =
    ctx.GetOwinEnvironment() |> OwinContext |> Option.ofObj
    |> Option.bind (fun c -> c.Authentication.User |> Option.ofObj)
    |> Option.map  (fun user -> user.Identity.IsAuthenticated)
    |> Option.defaultValue false

Option.bind采用选项<'a>和一个采用类型’a并返回选项<'a>的函数.当它在管道中使用时,它是一种“映射”Some或将其过滤为None的方式.

我会说你写的函数实际上看起来很好,但是这种方式可能被认为是更惯用的,尽管在这个例子中可以说有点难以理解. Option.bind在保存多层嵌套时真正发挥作用.

值得注意的是,在你的F#函数和我的函数中,我们假设Authentication和Identity属性都是非null的,并且在访问它们的属性时冒着空引用异常的风险.这与使用空传播的C#方法形成对比.目前在F#中没有内置方法可以做到这一点,但可能有一些先进的方法来模拟它.

也可以使用计算表达式来完成此操作.请参阅MaybeBuilder here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读