阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

理解和应用 F#中的“use”语法

  • 2007-08-27
  • 本文字数:1356 字

    阅读完需:约 4 分钟

F#是一个运行在 CLR 之上的函数式语言。尽管是一个研究性语言,它还是具有几个值得称道的地方,比如是第一个支持泛型的.NET 语言。

在最近关于F# 1.9.2 的帖子中, Don Syme 谈论到了“use”语法。本质上它不是那么有趣,仅仅是提供了对于 C#和 VB 开发人员来说很熟悉的 Using 结构的支持。实际上,“use”本身并没有比可以在 F#中轻易写出的“using”函数强大多少。

作为一个未来可能的增强部分,Don Syme 提到“use”语法能运用在类级别的代码中。如果是这样的,那么 IDisposable 模式将能被编译器自动实现。

在我们继续讲解之前,让我们花点时间来看看 IDisposable 模式。下面的代码是随 Visual Basic 一起发布的代码片段。

<span size="2"><span>Class</span> ResourceClass<br></br><span>Implements</span> IDisposable<p><span>Private</span> disposed <span>As</span> <span>Boolean</span> = <span>False</span> <span>' To detect redundant calls</span></p><p><span>' IDisposable</span><span>Protected</span> <span>Overridable</span> <span>Sub</span> Dispose(<span>ByVal</span> disposing <span>As</span> <span>Boolean</span>)</p><br></br><span>If</span> <span>Not</span> <span>Me</span>.disposed <span>Then</span><br></br><span>If</span> disposing <span>Then</span><p><span>' Free other state (managed objects).</span><span>End</span> <span>If</span></p><p><span>' Free your own state (unmanaged objects).</span><span>' Set large fields to null.</span><span>End</span> <span>If</span></p><br></br><span>Me</span>.disposed = <span>True</span><br></br><span>End</span> <span>Sub</span><p><span>#Region</span> <span>" IDisposable Support "</span></p><p><span>' This code added by Visual Basic to correctly implement the disposable pattern.</span><span>Public</span> <span>Sub</span> Dispose() <span>Implements</span> IDisposable.Dispose</p><p><span>' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.</span> Dispose(<span>True</span>)</p><br></br> GC.SuppressFinalize(<span>Me</span>)<br></br><span>End</span> <span>Sub</span><p><span>Protected</span> <span>Overrides</span> <span>Sub</span> Finalize()</p><p><span>' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.</span> Dispose(<span>False</span>)</p><br></br><span>MyBase</span>.Finalize()<br></br><span>End</span> <span>Sub</span><p><span>#End Region</span><span>End</span> Class</p></span>正如你看到的,有太多额外的东西需要写。就算类没有包含任何非托管资源,允许去除 Finalize 方法,还是需要写很多东西。到最后,依旧还有缺陷,因为没有错误处理代码,这会是按照这种方法编写代码遇到的一个主要问题。

这就是真正能感受到研究性语言带来的影响所在。通过把 F#的这个想法运用到 VB 和 C#中,我们将能把所有的这些八股代码简化为一个单独的方法,以便自动处理非托管对象。

查看英文原文: The “use” Binding In F# and How It Should Be Applied To C# and VB

2007-08-27 21:511414
用户头像

发布了 254 篇内容, 共 53.4 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

运维进阶训练营 -W18H

赤色闪电

运维进阶训练营 -W19H

赤色闪电

架构训练营模块九作业

现在不学习马上变垃圾

架构训练营10期

蚁人与量子停车场

脑极体

AI

云原生引擎单元测试实践

京东科技开发者

云原生 单元测试 代码覆盖

谷歌架构师分享gRPC与云原生应用开发Go和Java为例文档

程序知音

Java 架构 云原生 编程语言 后端

三月征文活动结果已出炉,快来看看有没有你

InfoQ写作社区官方

热门活动 ChatGPT

App Store 新定价机制 - 2023年最全版

37手游iOS技术运营团队

ios iap In App Purchase App Store Connect API app store

"我眼中的ChatGPT"征文获奖作品合集

InfoQ写作社区官方

技术专题合集 热门活动 ChatGPT

如何构建内部开发者门户:企业参考指南

SEAL安全

企业号 3 月 PK 榜 开发者体验 内部开发者门户

SVN管理工具:Cornerstone 4 激活版

真大的脸盆

svn Mac Mac 软件 SVN客户端

运维进阶训练营 -W17H

赤色闪电

「Go框架」bind函数:gin框架中是如何绑定请求数据的?

Go学堂

golang 开源 程序员 个人成长

《动手学深度学习--PyTorch》之学习环境搭建

IT蜗壳-Tango

SaaS时代下的我们需要什么样的数据库?

陈飞

Java并发夺命23问

程序员大彬

Java Java并发 java面试

AIGC导航网站推荐

kcodez

人工智能 AIGC Chat ChatGPT

GPT-4免费无限制使用教程

南城FE

人工智能 AI 前端 ChatGPT

PyTorch 深度学习实战 | 基于ResNet的花卉图片分类

TiAmo

数据集 PyTorch

阿里十年架构师总结的Java核心知识点大全,恐怖程度难以想象!

开心学Java

Java spring JVM Java工程师 多线程并发

【程序员日记】---当“微服务”遇到了“电饼铛“

京东科技开发者

架构 微服务 系统架构 开发 企业号 3 月 PK 榜

架构实战营第10期毕业设计-秒杀系统

Geek_4db2d5

【云原生 • Docker】用故事给老板讲Docker核心原理

Reactor2020

云原生 ,docker linux namespace

设计电商秒杀系统

Geek_e5f2e5

Removing HTTP/2 Server Push from Chrome

Yestodorrow

一种基于实时大数据的图指标解决方案

京东科技开发者

大数据 运维 系统架构 开发 图指标

如何落地质量门禁?

老张

软件测试 质量保障 质量度量 质量门禁

架构实战营10期-模块九作业

炮仗

Dubbo Triple 异常处理

昵称不能为null

dubbo triple协议 dubbo异常处理

可观测行之系统如何识别网站有多少文件命中了缓存?

Yestodorrow

可观测性 可观测性用观测云

利用 Amazon Managed Blockchain 发展和扩大忠诚度奖励计划(第一部分)

亚马逊云科技 (Amazon Web Services)

人工智能

理解和应用F#中的“use”语法_.NET_Jonathan Allen_InfoQ精选文章