与许多其他因简单而流行的语言不同,F# 还体现在其他方面,比如,能够写出成熟、稳健而安全的代码。通常的过程是先从简单的代码着手,随着代码库变大再进行一定的重构(refactor),方便其他 F# 开发人员访问,能写出更好的文档,支持与 .NET 和 C# 进行更好的互操作。
把功能封装(encapsulate)成 .NET 类,也许便从NET 语言中问的最重要步骤。F# 语言支持完整的 .NET 对象模型,创建 F# 类看起来就像通常的 .NET 类,具有类所有的附属内容,如静态类型信息和XML 文档。
我们将在第九章学习更多有关 F# 对象类型的内容,在第四部分会看到很多有关使代码稳健的技术。现在,我们来证明能够以传统的 .NET 风格使用 F#。在清单 1.12 中,我们把 sayHello 函数包装到 C# 风格的类中,并添加一个 Windows Forms 的用户界面。
Listing 1.12 Object-oriented “Hello world”using Windows Forms (F#)
open System.Drawing | [1]
openSystem.Windows.Forms |
type
HelloWindow() = [2]
let frm =
new Form(Width = 400, Height = 140)
let fnt =
new Font("Times New Roman", 28.0f)
let lbl =
new Label(Dock =
DockStyle.Fill, Font = fnt,
TextAlign =
ContentAlignment.MiddleCenter)
do frm.Controls.Add(lbl)
member
x.SayHello(name) = [3]
let msg =
"Hello " + name + "!"
lbl.Text <- msg <-- 修改 .NET 类型的属性
member
x.Run() = [4]
Application.Run(frm)
清单 1.12 开头是几个 open 指令[1],导入 .NET 命名空间下的类型。接下来,声明 HelloWindow 类[2],它包装的代码构造了用户界面,并公开了两个方法,第一个方法[3]包装的功能,是我们早前用交互式开发的连接“Hello world”消息,第二个方法将窗体作为标准的 Windows Forms 应用程序运行[4]。这个类的声明就像普通的 C# 类一样,差别在于 F# 用更轻量级的语法写类,在 F# 中使用类的代码看起来就像平常的 C# 代码一样:
let hello =
new HelloWindow()
hello.SayHello("dearreader")
hello.Run()
在这个阶段,我们是以传统的 .NET 风格进行应用程序开发的,因此,是作为独立的应用程序运行的。交互式风格对我们的帮助在于,已经测试了处理字符串连接的部分。应用程序运行的结果如图 1.4 所示。
图 1.4 运行在 F# 中使用面向对象风格创建的WinForms 应用程序
在本节,我们已经体验了典型的 F# 开发过程,但并没有解释所有用到的 F# 构造,因为在本书后面还会讨论。示例尽管很简单,但是说明了使用 F# 语言是能够写出相当标准的 .NET 程序的。
F# 能给 C# 开发人员提供什么?
F# 非常适合于开始只有简单的概念,后来再把它转换成为传统 .NET 版本,而C# 则主要面向传统的 .NET 风格。如果你是C# 的开发人员,在写实用程序时能够轻松地以两种方式利用 F#:
第一种选择,用 F# 进行快速的原型设计,试验代码,并探索 .NET 库是如何工作的。正如你所看到的,使用 F# 交互方式很方便,因此可以用 F# 来写代码的初稿;当尝试几种解决问题的方法,或者探索新的库函数时,会节省很多时间;如果一定要用 C# 来写代码,后来再用 C# 重写原型,仍能节省大量的开发时间。
第二种选择,是在 C# 项目中引用 F# 写的库。F# 是完全编译的 .NET 语言,所以,从技术上讲,没有必须更喜欢 C# 源代码。这样,只要简单地把代码转换成传统的 .NET 版本,就能轻松地从 C# 中访问库函数;对大型 .NET 解决方案,可以用 F# 写其中的一部分。
本章就要结束了[ 多么伤感],你仍会发现一些 F# 语言构造令人费解,这是很有可能的,但介绍的目的不是教会你关于 F# 的所有内容,我们的目标是展示 F# 外观和风格,方便你在接下来的章节中,能够随着我们探索更有趣的例子,进行实验。
1.5.2.2 到稳健结束