C#从来都不是纯面向对象的编程语言。从一开始,C#就是面向组件的编程语言。面向组件是什么意思?C#提供了面向对象编程语言也在使用的继承和多态性;此外,它还通过特性提供对属性、事件和注释的本机支持。随后带有LINQ和表达式的版本也包括了声明性编程。使用声明式LINQ表达式,编译器会保存一个表达式树,该表达式树稍后由提供程序用于动态生成SQL语句。
C#并不仅仅是单一的编程语言范例。相反,目前使用C#创建应用程序的实用功能已添加到C#的语法中。在过去的几年里,还添加了与函数式编程相关的更多特性。
函数式编程的基础是什么?函数式编程的最重要概念基于两种方法:避免状态突变和将函数作为一流的概念。接下来的两部分将详细介绍这两种方法。
注:本章并没有给出用纯函数编程范式来编写应用程序的所有信息。这需要一整本书的篇幅。(如果想用这个范例编写程序,就应该考虑使用F#编程语言,而不是使用C#。)本章将采用编程的方式——与C#一样。函数式编程使用的一些特性对所有应用程序类型都很有用;这就是C#中提供这些特性的原因。随着时间的推移,越来越多的函数式编程功能将会以符合C#编程风格的方式添加到C#中。
避免状态突变
编程语言F#是一种函数优先的语言,使用它创建自定义类型时,这种类型的对象默认时不可变的。对象可以在构造函数中初始化,但以后不能修改。如果需要可变性,该类型就需要显示地声明为可变的。这与C#不同。
在C#中,一些预定义类型是不可变的,比如string类型。用于更改字符串的方式总是返回一个新字符串。集合是不可变的吗?LINQ使用的方法不会更改集合。相反,像Where和OrderBy这样的方法会返回一个已过滤的新集合,以及一个排序的新集合。
另一方面,List<T>集合提供了以可变