写点什么

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

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

关注

评论

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

面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!

冰河

分布式事务 微服务 分布式数据库 系统架构 中间件

JAVA稳定底层,快速开发首选,XJR智能化客户关系管理

Marilyn

敏捷开发 快速开发 软件架构 客户关系管理

《Linux学习笔记》从常用命令、常用操作到网络管理、性能优化,无论是Java开发或是运维都可以学习!

Java架构之路

Java 程序员 架构 面试 编程语言

架构师第一期作业(第 6 周)

Cheer

会展云技术解读丨多重安全保障护航云上会展

京东科技开发者

云计算 云服务 云平台

本文将大数据学习门槛降到了地平线

MySQL从删库到跑路

大数据 hadoop hdfs mapreduce

Netty源码解析 -- 内存对齐类SizeClasses

binecy

Netty 内存管理

Vidyo独特的互联网适应性

dwqcmo

音视频 集成架构 解决方案 智能硬件

技术实践丨PostgreSQL开启Huge Page场景分析

华为云开发者联盟

数据库 管理 内存

十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略

华为云开发者联盟

数据库 性能 调试

解惑“高深”的Kafka时间轮原理,原来也就这么回事!

华为云开发者联盟

中间件 消息队列

刚从蚂蚁金服Java研发岗面试回来(三轮游),我总结的面试经历(附面试题+答案)

Java架构追梦

Java 架构 面试 蚂蚁金服

Mac/Windows 连接 Ubuntu 的 samba 服务器

jiangling500

ubuntu Mac windows Samba

如何获取变量token的值

测试人生路

软件测试 接口测试

LeetCode题解:78. 子集,迭代+位运算,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

架构师训练营 - 第 6 周课后作业(1 期)

阿甘

区块链将构建数字社会高效的全球网络

CECBC

数字经济 数字时代

工作5年的阿里Java程序员分享从业心得总结与面试笔记分享

Java架构师迁哥

【高并发】导致并发编程频繁出问题的“幕后黑手”

冰河

并发编程 多线程 高并发 高性能 异步

甲方日常 41

句子

工作 随笔杂谈 日常

架构师训练营 - 第二周学习总结

joshuamai

Java程序员必须人手一本的《码出高效:Java 开发手册》,免费分享PDF文档

Java架构之路

Java 程序员 架构 面试 编程语言

区块链是连接传统经济和数字经济的桥梁

CECBC

区块链 数字经济

与其思考公司该为员工提供什么福利,不如思考有哪些 “福利” 不应该提供!

非著名程序员

个人成长 管理 福利

深度对比Apache CarbonData、Hudi和Open Delta三大开源数据湖方案

华为云开发者联盟

hadoop 开源 数据处理

测试悄然扩围 千万元红包搅活数字货币江湖

CECBC

数字人民币

问题篇:附源码询问Pageable实现分页无法使用原生sql

小Q

Java 学习 架构 面试 springboot

【JSRC小课堂】Web安全专题(三)SRC漏洞挖掘技巧:三步走收集高质量信息

京东科技开发者

WEB安全

架构师训练营 - 第 6、7、8、9、10 、11、12、13周学习总结(1 期)

阿甘

DeFi流动性挖矿系统开发技术方案

薇電13242772558

区块链 defi

架构师训练营 - 第二周课后练习

joshuamai

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