1.5.2.2 到稳健结束

与许多其他因简单而流行的语言不同,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 到稳健结束

时间: 2024-08-10 21:28:04

1.5.2.2 到稳健结束的相关文章

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

c#:ThreadPool实现并行分析,并实现线程同步结束

背景: 一般情况下,经常会遇到一个单线程程序时执行对CPU,MEMORY,IO利用率上不来,且速度慢下问题:那么,怎么解决这些问题呢? 据我个人经验来说有以下两种方式: 1.并行.多线程(Parallel.Task.ThreadPool) 2.多进程MutilpleProcess 恰好工作中又一次遇到单线程程序性能低的问题,本次我主要想尝试使用ThreadPool来实现多线程,并且在实现多线程任务同步结束. 测试代码: 1 static void Main(string[] args) 2 {

Activity优化几个结束的方法

1 package com.itau.jingdong; 2 3 import java.util.Stack; 4 import android.app.Activity; 5 import android.app.ActivityManager; 6 import android.content.Context; 7 8 /** 9 * @author Tau.Chen 陈涛 10 * 11 * @email [email protected],[email protected] 12 *

Android 开发中踩过的坑之十: 谨慎处理动画的开始和结束

Android提供多种动画机制, 从面相对象的方式到直接实现底层onDraw的方式, 给予了足够的控件实现希望的效果, 无论时使用哪种方式实现动画, 都要谨慎的处理动画的两个状态, 开始和结束 需要关注的问题有: 1 动画开始的时候是否需要重新初始化内存? 对于需要重复展示的动画, 应当避免每次都new新的内存, 否则在动画展示过程, 内存会不断增加, 而gc合适回收, 是不确定的. 也许当gc时, 你已经在OOM的边缘了. 2 动画开始时是否是从某个中间状态开始的? 动画从某个中间状态开始,

对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关心应用可同时处理的请求数,以及响应时间.应用本身和它运行在其中的web容器是两个很重要的影响因素.对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束.如果同时进来的请求多于当前可用的请求处理线程数,额外的线程就会被创建,直到到达配置的最大线程数(maxThreads

springboot使用thymeleaf时报html没有结束标签

在使用springboot的过程中,如果使用thymeleaf作为模板文件,则要求HTML格式必须为严格的html5格式,必须有结束标签,否则会报错!解决办法如下: 1.你可以使用严格的标签,也就是每个标签都有结束标签,这种可能比较麻烦 2.在application.properties中增加spring.thymeleaf.mode=LEGACYHTML5,即声明thymeleaf使用非严   格的html.启动之后访问页面会报如下错误: org.thymeleaf.exceptions.Co

连载《一个程序猿的生命周期》-《发展篇》 - 9.赌局结束了,一个时代的结束

注:看本篇文章前,先看<中层管理危机>和<用"厚道"向对"操蛋"的社会> 第一家公司分裂成了三个公司,从那走后一直与R总(原直接领导)和W总(原总经理)保持着联系,在他们之间也保持着利益平衡(也是生活压力所迫),相互之间保持着一种微妙的状态和关系,大家也清楚是怎么回事.我深知这种状态不会维持太长时间,现在只是偶尔联系,没有了利益关系. 前些天采摘西瓜,回来给R总送去些(他自己来家拉的),每年如此.路旁短暂交流最近的个人的情况.公司的情况.项目

随时结束程序

实验名称:随时结束程序 实验需求:back键可能需要按很多次,home键只是将程序暂时挂起 实验现象:在第3个活动 实验思路:设置一个专门的集合类对所有的活动进行管理. 步骤: 1.新建一个项目,创建3个活动,活动可以通过button切换 2.新建一个ActivityCollector类作为活动管理器 public class ActivityCollector { public static List<Activity> activities=new ArrayList<>();

C++结束进程 并能显示其父进程

声明:有些网友有可能在CSDN博客上看到过相同的文章,因为本人有两个账号...请不要误会,均为原创 这个程序功能强大哦~~ #include <cstdio> #include <windows.h> #include <winbase.h> #include <wtypes.h> #include <tlhelp32.h> #include <psapi.h> #include <tchar.h> #include &l