【发布时间】:2010-06-01 09:30:10
【问题描述】:
让我们看一下代码,由 F# 生成的简单函数:
let map_add valueToAdd xs =
xs |> Seq.map (fun x -> x + valueToAdd)
为 lambda 表达式(F# 函数值的实例)生成的代码如下所示:
[Serializable]
internal class map_add@3 : FSharpFunc<int, int> {
public int valueToAdd;
internal map_add@3(int valueToAdd) { this.valueToAdd = valueToAdd; }
public override int Invoke(int x) { return (x + this.valueToAdd); }
}
看看几乎相同的 C# 代码:
using System.Collections.Generic;
using System.Linq;
static class Program {
static IEnumerable<int> SelectAdd(IEnumerable<int> source, int valueToAdd) {
return source.Select(x => x + valueToAdd);
}
}
以及为 C# lambda 表达式生成的代码:
[CompilerGenerated]
private sealed class <>c__DisplayClass1 {
public int valueToAdd;
public int <SelectAdd>b__0(int x) { return (x + this.valueToAdd); }
}
所以我有一些问题:
- 为什么 F# 生成的类没有标记为
sealed? - 为什么 F# 生成的类包含 public 字段,因为 F# 不允许可变闭包?
- 为什么 F# 生成的类有构造函数?它可以用公共字段完美初始化...
- 为什么 C# 生成的类没有标记为
[Serializable]?此外,为 F# 序列表达式生成的类也变成了[Serializable],而 C# 迭代器的类则没有。
【问题讨论】:
标签: c# serialization f# lambda