写点什么

理解和应用 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:511522
用户头像

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

关注

评论

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

实践分享:30分钟在电脑端运行小程序

FN0

桌面应用 桌面应用开发

2 分钟,教你用 Serverless 每天给女朋友自动发土味情话

阿里巴巴云原生

阿里云 Serverless 云原生

10月月更获奖名单出炉啦!快来看看你上榜没有!

InfoQ写作社区官方

热门活动

Redis6.0新特性、剖析线程模型(单线程和多线程)

C++后台开发

redis 多线程 后端开发 单线程 C++开发

Wallys/Introduction of DR9074 series network card/qcn9074/qcn9072/qcn9024/industrial M.2 card

wallysSK

QCN9074 QCN9024 QCN9072

vue和react的区别有哪些,哪个好

千锋IT教育

云原生网关的可观测性体系实践

阿里巴巴云原生

阿里云 云原生 云原生微服务

鼎茂科技获得阿里云首批产品生态集成认证,携手阿里云共建新合作

阿里巴巴云原生

阿里云 云原生 加速器 企业招募

居民消费价格指数变化新鲜出炉,这类商品同比涨幅最大

前嗅大数据

数据分析 数据采集 居民消费 居民消费指数

技术解读倚天 ECS 实例——Arm 芯片的 Python-AI 算力优化 | 龙蜥技术

OpenAnolis小助手

Python AI arm ECS sig

数字化时代,企业需要怎样的数据中台?报名元年微课堂,一起来探索

元年技术洞察

数据中台

java企业级开发中常见的注入方式

千锋IT教育

扒去Spring事件监听机制的外衣,竟然是观察者模式

程序知音

Java spring ssm Java后端 后端技术

一路同行:开发者与华为云的2022

脑极体

Docgeni 2.0 发布,开启自动化

PingCode研发中心

JavaScript刷LeetCode拿offer-树的遍历

js2030code

JavaScript LeetCode

首批!腾讯云通过金融开源技术服务能力评估

腾源会

开源

线性稳压电源和开关电源,到底有什么区别?

元器件秋姐

电源电路 元器件采购 元器件电商 元器件知识 华秋商城

【Redis】Redis AOF持久化

石臻臻的杂货铺

redis 11月月更

聚焦年轻消费人群 百草味入围最受“Z世代”喜爱品牌TOP10

E科讯

8分钟带你学会SpringBoot整合Redis来实现缓存技术

好程序员IT教育

redis Spring Boot

10 分钟部署一个 API 工具

Scar 

开源 Serverless 接口测试 Vercel

RocketMQ 5.0 API 与 SDK 的演进

阿里巴巴云原生

阿里云 RocketMQ 云原生

数据分析er看过来,五款工具有你需要的

葡萄城技术团队

数据分析 前端 数据可视化

基于Jmeter的百万级tps性能测试实践

环信

Jmeter 性能测试

大数据 Hadoop 的五大优势

千锋IT教育

Kotlin变量的空安全(Null Safety)

子不语Any

android kotlin 11月月更

Spring Boot框架下实现Excel服务端导入导出

葡萄城技术团队

前端 Excel 控件

【倒计时4天】杭州专场-单元测试产品体验样板间,等你加入!

TRaaS

以用户为导向,vivo打造安全新范式

Geek_2d6073

关于Web3.0,你了解多少?个推与您畅聊下一代互联网

个推

互联网 元宇宙 Web3.0

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