9.5 在 C# 中使用 F# 库
像 C# 一样,F# 也是一种静态类型的语言,就是说,编译器知道每个值的类型,以及类方法和属性的签名。对于与 C# 的互操作性来说,这是非常重要的,因为,编译器可以生成代码,看起来就像普通的 .NET 库。
与其他 .NET 语言的互操作性
F# 和 C# 或 VB.NET 之间的互操作性是非常平滑的,相比有 .NET 实现的动态类型的语...
9.4.2.2 F# 中的向上转换和向下转换(UPCASTSAND DOWNCASTS)
如果类型之间的转换不会失败,就称为向上转换(upcast)。我们已经看到,把类型转换成由该类型实现的接口,就是这种情况;另一个示例是把派生类转换成它的基类,在这种情况下,编译器也可以保证操作是正确的,不会失败。
如果有一个基本类型的值,希望将它转换为继承类,操作可能会失败,因为基类的值可能是目标类的...
分类:
其他好文 时间:
2014-12-12 19:14:21
阅读次数:
170
9.4.2 实现接口和类型转换
我们已经讨论过在 F# 中如何声明接口,如何使用对象表达式,创建实现接口的值。这是一个非常轻量级的解决方案,类似于 lambda 函数。正如 lambda 语法,对于创建函数来说,并不总是合适的选择一样,有时,在命名类中实现接口,是有道理的。
我们将继续使用在本章前面的示例,来看一下用 C# 和 F# 实现接口,我们回顾一下两种语言中的接口声明:
...
分类:
其他好文 时间:
2014-12-12 16:47:52
阅读次数:
170
9.4.2.1 在 F# 中实现接口
清单 9.17 使用 C# 中的显式接口实现,因为,这是 F# 允许的唯一的接口实现的风格。在函数编程风格中,这通常足够了。如果确实需要直接公开类的功能,可以添加额外的、调用相同代码的成员。清单 9.18 显示了前面示例的 F# 版本。
清单 9.18 在类中实现接口 (F#)
type CoefficientTest(incomeCoeff...
分类:
其他好文 时间:
2014-12-12 16:46:59
阅读次数:
136
9.4 具体的对象类型
面向对象编程中的最重要的结构,就是类的声明。它的价值体现用 F# 写的库,可以在 C# 中使用,因为从 C# 中引用F# 声明的类时,看起来就像普通的类。从概念上讲,类有一点像带成员的记录,因为,它们把值存储在字段中,并提供成员进行访问;类还有另外的功能,在 F# 中,出现下列情况,通常使用类:
■ 需要封装数据和行为时。
■ 在迭代开发过程的后期,把简单的元组...
分类:
其他好文 时间:
2014-12-12 11:49:28
阅读次数:
174
9.4.1 函数式和命令式类
在类或者类的构造函数的参数值中的 let 绑定,就像我们在其他 F# 代码中看到的 let 绑定一样,也是不可变值;此外,使用 member 关键字声明的属性,创建的是只读属性(只有 getter)。因此,如果类只引用其他不可变类型的值,那么,类也不可变。
比方说,在前面的例子中,我们要允许改变客户的收入,可以有两种方式:
■以纯函数式风格,对象将返回一...
分类:
其他好文 时间:
2014-12-12 11:42:13
阅读次数:
146
9.3.2.1 用关键字 use 编程
我们已经知道,如果用关键字 use 创建值,编译器会自动在声明这个值的函数结尾,插入对 Dispose 方法的调用。这对于资源管理来说是有用的,但还有其他情况,我们需要在两个函数调用之间加包括一段代码。
假设我们希望用不同的颜色输出文本到控制台,然后,再恢复原来的颜色。用传统的方法,我们必须保存原来的颜色,设置新的颜色,发送输出到控制台,再恢复原来...
分类:
其他好文 时间:
2014-12-11 17:28:44
阅读次数:
142
9.3.1 使用 .NET 集合
到目前为止,虽然我们主要是用F# 内置的列表类型来保存数据集合,在某些情况下,使用其他的 .NET 类型,比如,System.Collections.Generic 命名空间下的 Dictionary 类,也是有用的。这种类型对需要根据键进行快速访问,特别有用,因为提供了类似功能的不可变类型(比如,F# 库中的 Map),效率低下。
需要注意的是,Dic...
分类:
Web程序 时间:
2014-12-11 15:59:47
阅读次数:
152
9.3.2 用 IDisposable 接口清理资源
我们已经使用过几种实现了 IDisposable 接口的类型,比如,Graphics 和 SolidBrush。我们想使代码尽可能易于理解,因此,当使用完对象时,我们就显式调用 Dispose 方法。
C# 中包含了语法糖,以 using 语句的形式,保证了即使语句体内抛出异常,也能调用 Dispose;F# 有相似的结构,用 use...
分类:
其他好文 时间:
2014-12-11 15:52:46
阅读次数:
142
9.2.2 使用接口对象类型
就像记录和差别联合一样,接口类型使用 type 构造来声明。清单 9.8 显示了把以前的检查记录类型,转换为接口类型。
清单 9.8 用接口表示客户检查 (F#)
type ClientTest =
abstract Check : Client –> bool
abstract Report : Client -> unit
在...
分类:
其他好文 时间:
2014-12-11 12:28:30
阅读次数:
128