东莞网站建设推广品众,网站排名高权重低,南宁网站建设团队,中国建设工程有限公司简单介绍 F##xff08;与C#一样#xff0c;念作“F Sharp”#xff09;是一种基于.Net框架的强类型、静态类型的函数式编程语言。可以说C#是一门包含函数式编程的面向对象编程语言#xff0c;而F#是一门包含面向对象的函数式编程语言。可以查看官方文档了解更多信息。 本系… 简单介绍 F#与C#一样念作“F Sharp”是一种基于.Net框架的强类型、静态类型的函数式编程语言。可以说C#是一门包含函数式编程的面向对象编程语言而F#是一门包含面向对象的函数式编程语言。可以查看官方文档了解更多信息。 本系列文章假设你在了解C#的情况下将F#与C#在异同点上进行说明让读者能快速地对F#有个系统的了解。才疏学浅错漏难免如果您在阅读过程中有什么建议或意见还请不吝指教。 函数式编程这几年一直不温不火但相信了解了F#之后对C#也会有更深的认识对学习其他函数式语言也会更容易上手。 Hello, World 在使用F#时可以像C#一样创建一个控制台项目进行测试。但因为F#支持以脚本形式运行所以直接打开F# Interactive以下简称fsi进行交互是最方便的。 在Visual Studio中可在“视图-其他窗口”中打开。以前没有csi的时候一直拿fsi来测试C#代码在VS2015中终于添加了csi。如果不想打开臃肿的VS可在Microsoft SDK的安装位置找到fsi。以下是我安装的F# 4.0的fsi的位置 C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\Fsi.exe 介绍任何语言的特有方式就是通过那几乎成为标准的“Hello, World”程序。F# 输出可使用 printf 函数如下 printf Hello, world! 当然也可以像C#一样使用 .Net 的控制台输出函数 System.Console.Write(Hello World) 当把以上代码敲进fsi里按回车后会发现并没反应是因为在fsi里提交代码必须以;;双分号结尾。请输入 printf Hello, world!;; 和 System.Console.Write(Hello World);; 或者在换行后输入;;再次回车。如图 F#基础类型 下面我们尝试把以下简单的C#代码转换成F#代码 int sum 0;
for (int i 0; i100; i)
{ if (i%2 ! 0) sum i;
}
Console.WriteLine(0到100中的奇数的和为{0}, sum); 这段命令式代码只是简单地把0到100中的奇数相加并把和输出。虽然在C#中也支持函数式但在这里我们为了了解基本语法使用简单语句来介绍。 以下是F#版本的代码 let mutable sum 0
for i 0 to 100 doif i%2 0 then sum - sum i printfn 0到100中的奇数的和为%A sum ;; 以上代码在fsi里的运行结果为 0到100中的奇数的和为2500val mutable sum : int 2500val it : unit () 可以看出F#中每行代码结尾的;是可选的。 因为函数式编程语言的特点之一便是无副作用No Side Effect、不可变Immutable所以没有变量Variable的概念只有值Value的概念。所以在上面的运行结果中都是以val开头而值it默认为最后一次运行结果在此例中其类型为unit相当于C#中的void即无返回值。 但是在很多场景下Mutable可变可以带来很多便利尤其是在像上面结合命令式编程的场景中。在上面的代码中val mutable sum即为一个可变的值。 基础类型 下面将C#和F#的数据类型定义作对比 数据类型C#F#Intint i 0;let i 0 let i 0lUintuint i 1U;let i 1u let i 1ulDecimaldecimal d 1m;let d 1m let d 1MShortshort c 2;let c 2sLonglong l 5L;let l 5Lunsigned shortushort c 6;let c 6usunsigned longulong d 7UL;let d 7ULbytebyte by 86;let by 86y let by 0b00000101y let by ‘a’Bunsigned bytesbyte sby 86;let sby 86uy let sby 0b00000101uyboolbool b true;let b truedoubledouble d 0.2;double d 0.2d double d 2e-1 double d 2 double d0 0let d 0.2 let d 2e-1 let d 2. let d0 0x0000000000000000LFfloatfloat f 0.3;foat f 0.3f;float f 2;float f0 0.0f;let f 0.3f let f 0.3Flet f 2.f let f0 0x0000000000000000lfnative intIntPtr n new IntPtr(4);let n 4nunsigned native intUIntPtr n new UIntPtr(4);let n 4uncharchar c ‘c’;let c ‘a’stringstring str “abc\n”;string str c:\filename;let str “abc\n” let str c:\filenamebig intBigInteger i new BigInteger(9);let i 9I F#的字面量详细介绍可查看MSDN文章。 十六进制、八进制和二进制 我们知道在C#中可以用0x前缀定义十六进制数值。而F#中除了十六进制0x还可以直接定义八进制0o和二进制0b的数值。 let hex 0xFABClet oct 0o7771Llet bin 0b00101010y;; 输出结果为 val hex : int 64188val oct : int64 4089Lval bin : sbyte 42y 浮点数 需要注意的是在F#里double和float都代表双精度浮点数单精度浮点数称为float32。String还有一个字面量表示方法是三个双引号 let str book titleParadise Lost content / /book 在使用为前缀称为Verbatim String时字符串内的若出现双引号必须使用两个双引号转义使用三个双引号的表示法避免了这个问题。这种表示法最常用在把XML文档编码到代码文件里。 字节数组 在类型对比表中byte行可以看到有一个创建字节数组的语法 let asciiBytes abcB // val asciiBytes : byte [] [|97uy; 98uy; 99uy|] 其等价的C#代码是 byte[] asciiBytes Encoding.ASCII.GetBytes(abc); 当然只支持ASCII编码。 变量名 F#的变量名命名规则与C#基本一致但也可在变量名中包含单引号: let x 10let x 11let Toms 2010 通过let关键字将10绑定赋值到x将11绑定到x。 在C#中若要将关键字或保留字作为变量名则可以变量名前加实现例如使用代码 class class {} 定义一个名为class的类。 但是在F#中只需在前后加上即可将任意字符串指定为变量名 let let 4let I love F# This is an F# program.(*在fsi的输出结果为val let : int 4val ( I love F# ) : string This is an F# program.*) 注意在F#中单行注释和C#一样使用//但多行注释使用(* *)。 F#的运算符与C#类似部分区别将在下一篇介绍。感兴趣的可以在fsi里尝试输入运算玩一玩或许就可以发现区别了。 原文地址http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-1.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注