(一)什么是函数式编程
函数式编程(FC)是以函数作为第一类值,避免状态突变的编程风格。
状态突变:存储在寄存器的值就地更新。
(二)C#中有哪些常见的函数式方法
LINQ的Where和OrderBy函数对列表进行过滤或排序不会影响原始列表;
Sort函数对列表排序会影响原始列表。
var nums = Range(-10000,20001).Reverse().ToList();//[10000,9999,..,-9999,-10000]
Action task1 = ()=> WriteLine(nums.Sum());
Action task2 = ()=> {nums.Sort();WriteLine(nums.Sum())};
Parallel.Invoke(task1,task2);
// prints : 随机数;
// prints : 0;
Action task3 = ()=> WriteLine(nums.OrderBy(x=>x).Sum());
Parallel.Invoke(task1,task3);
//prints : 0;
//prints:0
(三) C# 6和C# 7 中的函数式特性
- 使用using static 导入静态成员,使用静态函数时,无需使用静态类名
using static System.Math;
public double Circumference => PI * 2;
- 具有只读的自动属性
public class A
{
public A (double readOnlyField) => ReadOnlyField = readOnlyField;
public double ReadOnlyField {get;} // 由于ReadOnlyField只有在构造函数中被赋值,一旦被创建,便不可被修改,属于不可变类型,因此编译器会隐式声明为readonly。内联函数中被赋值同理。
}
- 具有表达式体式的成员
public double Circumference => PI * 2
- 局部函数
通过在方法作用域内声明局部函数,明确局部函数只能从一个位置被调用
get
{
double Square(double d)=>Pow(d,2);
return PI * Square(2);
}
- 元组语法
元组在FP中的作用更倾向于将任务分解为非常小的函数,通常将元组类型的输出 当作另一个函数的 输入
public (double a,double b) Stats => (A,B);