第十四章 兼容性和高级互操作

在这一章,我们将学习F# 与其他语言进行互操作所需的内容,不仅包括在.NET 框架内,而且也包括从F# 中使用非托管代码,以及从非托管代码中使用 F#。

警告

在本书中,我尽一切努力保证使你只需要了解 F#;然而,在这一章,虽然我一直保持代码对这些语言中的最低需求,但是,如果你知道一点 C#、 C++ 或 .NET Common IL 的内容,对你是有帮助的。

C# 调用 F# 库

在 F# 中可以创建两种类型的库:一种是只在 F# 中使用的库,另一种是可以在任何.NET 语言中使用的库。这是因为 F# 可以用丰富、功能强大的方式利用 . NET 类型系统,因此,有些类型对其他.NET 语言看起来可能有点独特;然而,当从 F# 中来看时,这些类型总是会看起来像他们应该的那样。

因此,虽然可以从任何.NET 语言中使用 F# 中的任何库,但是,如果想使库尽可能的友好,就需要遵守一定的规则。下面就是我总结的一些规则:

? 始终使用符号 .fsi 文件,或者 private和 internal 来隐藏实现的细节,归档客户端需要的应用编程接口

? 避免公开返回元组的函数;

? 如果要将公开一个函数,它接收的参数值是另一个函数,那么,公开值作为委托;

? 不要在应用编程接口中使用联合类型,但是,如果你确实必须使用这些类型,那么,就添加成员,使它们更容易使用;

? 避免返回 F# 列表,相反,应该使用 System.Collections.ObjectModel命名空间下的数组、System.Collections.Generic.IEnumerable,或者更好的是使用集合 和 ReadOnlyCollection;

? 如果可能,把类型定义放在命名空间下,在模块中只放值定义;

? 小心在类和接口中定义的签名,一个小的语法改动,会引起很大的差别。

在以下几节中我将用示例来说明这些。

第十四章 兼容性和高级互操作

时间: 2024-10-13 16:59:18

第十四章 兼容性和高级互操作的相关文章

【linux高级程序设计】(第十四章)TCP高级应用

文件I/O方式比较 1.阻塞式文件I/O 进程从调用函数开始,直到返回这段时间都处于阻塞状态. 2.非阻塞式文件I/O 如果当前没有数据可操作,将不阻塞当前进程,而是立即返回一个错误信息.需要反复尝试. 3.多路复用I/O 仍然是阻塞方式等待,但是可以同时等待多个文件描述符. 4.信号驱动I/O 异步方式,等到数据准备好后通知处理进程,不需要重复询问,效率高. I/O阻塞与非阻塞操作 阻塞方式:默认情况下read/write和 把flag设为0的recv/send 非阻塞方式:如果没有数据,立刻

【linux高级程序设计】(第十四章)TCP高级应用 3

控制socket文件描述符属性 1.set/getsockopt()修改socket属性 int getsockopt (int __fd, int __level, int __optname, void *__restrict __optval, socklen_t *__restrict __optlen):获得某个套接字的属性.成功0,失败-1 int setsockopt (int __fd, int __level, int __optname, __const void *__op

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(

JavaScript高级程序设计:第十四章

第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继承了HTMLElement,因而与其他HTML元素具有相同的默认属性.不过,HTMLFormElement也有它自己下列独有的属性和方法. 取得<form>元素的引用方式有好几种.其中最常见的方式就是将它看成与其他元素一样,并为其添加id特性,然后再像下面这样使用getElementById()方

Python基础教程(第十四章 网络编程)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5538341.html______ Created on Marlowes 本章将会给读者展示一些例子,这些例子会使用多种Python的方法编写一个将网络(比如因特网)作为重要组成部分的程序.Python是一个很强大的网络编程工具,这么说有很多原因,首先,Python内有很多针对常见网络协议的库,在库顶部可以获得抽象层,这样就可以

第四十四章

第四十四章1 听罗博士讲述名人的烦恼 名与身孰亲? 名气与身体哪个更重要? 名气固然是有用的,然而不能因此放弃身体. 各位朋友大家好,今天我们接着来聊<道德经>.我们来看看老子老先生带给我们什么样的人生启发了. 今天聊第四十四章,这是新的一章了,这一章实际跟我们的人生真是有很大的关系了,因为我这个音频,除了在我微信公众号刊出之外,还在喜马拉雅播出,喜马拉雅的编辑曾经跟我说:“罗老师您最近能不能讲讲养生的内容啊?”我接下来会给大家讲中医的内容的,但是您说我讲的<道德经>就不是养生吗?

Python 3标准库 第十四章 应用构建模块

Python 3标准库 The Python3 Standard Library by  Example -----------------------------------------第十四章     应用构建模块-----------------------------14.1  argparse:命令行选项和参数解析----------------------------- argparse模块 14.1.1  建立解析器 14.1.2  定义参数 argparse模块 14.1.3 

【WPF学习】第二十四章 基于范围的控件

原文:[WPF学习]第二十四章 基于范围的控件 WPF提供了三个使用范围概念的控件.这些控件使用在特定最小值和最大值之间的数值.这些控件--ScrollBar.ProgressBar以及Slider--都继承自RangeBase类(该类又继承自Control类).尽管它们使用相同的抽象概念(范围),但工作方式却又很大的区别. 下表显示了RangeBase类定义的属性: 表 RangeBase类的属性 通常不比直接使用ScrollBar控件.更高级的ScrollViewer控件(封装了两个Scro

【WPF学习】第十四章 事件路由

原文:[WPF学习]第十四章 事件路由 由上一章可知,WPF中的许多控件都是内容控件,而内容控件可包含任何类型以及大量的嵌套内容.例如,可构建包含图形的按钮,创建混合了文本和图片内容的标签,或者为了实现滚动或折叠的显示效果而在特定容器中放置内容.设置可以多次重复嵌套,直至达到你所希望的层次深度.如下所示: <Window x:Class="RouteEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2