在这一章,我们将学习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;
? 如果可能,把类型定义放在命名空间下,在模块中只放值定义;
? 小心在类和接口中定义的签名,一个小的语法改动,会引起很大的差别。
在以下几节中我将用示例来说明这些。
第十四章 兼容性和高级互操作