More specifically what are the characteristics (if any) that delegates have that functions as first class values in F# don't have; and what are the characteristics that functions as first class values have (if any) that delegates in C# don't have?
相关问题
- Sorting 3 numbers without branching [closed]
- Graphics.DrawImage() - Throws out of memory except
- Why am I getting UnauthorizedAccessException on th
- 求获取指定qq 资料的方法
- How to know full paths to DLL's from .csproj f
Delegates and F# "First class function values" are quite different.
Delegates are a mechanism of the CLR, a type-safe wrapper around function-pointer+object pairs (for instance methods, the
this
-pointer gets captured together with the method address).F# function values on the other hand, are implementation of an abstract class
FSharpFunc<,>
(it used to be calledFastFunc<,>
before the official release of F#). Invocation happens via ordinary virtual methods, which is much faster than delegate invocation. That is the reason the F#-team didn't use delegates in the first place.So if you can "implement" functions as first class values via abstract classes/virtual methods, why did Microsoft add delegates?
Ok, but we have Generics since .NET 2.0, why do we still have delegates? Why can't we just use
Func<,>
andAction<>
for everything?+=
syntax you essentially add your event-handler-delegate to the chain of delegates in the event field.Apart from events, is there a reason to use delegates over
FSharpFunc<,>
Yes, one: Each and every implementation of
FSharpFunc<,>
, that includes lambda-expressions*, is a new class. And in .NET classes are encoded in the metadata of the compiled assembly. Delegates on the other hand require no extra metadata. The delegate types do but instantiating these delegate types is free in terms of metadata.But wait, aren't C# lambda-expressions/anonymous methods too implemented as hidden classes?
Yes, C# lambdas take the worst of both worlds ^^
I just wanted to add that this statement from SealedSun isn't true:
F# functions are not faster then delegate invocation, maybe that was the case back in .NET 1.0, but now a days delegate invocation and invoking virtual methods are pretty much on-par.
Also invoking F# functions that can't be bound statically by the compiler is very slow compared to invoking a delegate.
Produces the following results on my computer