Difference between Func<> with delegate and lambda expression

17,799

Solution 1

They're the same, basically. They're both anonymous functions in C# specification terminology.

Lambda expressions are generally more concise, and can also be converted to expression trees, which are crucial for out-of-process LINQ.

Anonymous methods allow you to drop the parameter list if you don't care. For example:

EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter");
};

Given how rarely the latter point is required, anonymous methods are becoming an endangered species in modern C#. Lambda expressions are much more common.

Solution 2

So basically.. What is the difference of these two lines? And are these lines compiling to the same CIL?

There's just two different ways to write the same thing. The lambda syntax is newer and more concise, but they do the same thing (in this case).

Note that lambdas (=> syntax) can also be used to form Expression Lambdas, where you make an Expression Tree instead of a delegate. This is nice since you can use the same syntax whether you're using LINQ to Objects (which is based around delegates like Func<T, TResult>) or LINQ to Entities (which uses IQueryable<T> and expression trees).

Share:
17,799
Memet Olsen
Author by

Memet Olsen

Walking on water and developing software from a specification are easy if both are frozen.

Updated on June 05, 2022

Comments

  • Memet Olsen
    Memet Olsen almost 2 years

    while deepening myself to more advanced features of C#, I came across some code, which I didn't exactly know the difference of. It's about these two lines:

    Func<string, int> giveLength = (text => text.Length);
    

    and

    Func<string, int> giveLength = delegate(string text) { return text.Length; };
    

    This can be used in the same way:

    Console.WriteLine(giveLength("A random string."));
    

    So basically.. What is the difference of these two lines? And are these lines compiling to the same CIL?

  • Memet Olsen
    Memet Olsen over 11 years
    Thanks Jon. Btw I recently started reading your ebook 'C# in Depth'. Very helpful!
  • Jon Skeet
    Jon Skeet over 11 years
    @memetolsen: The downside is, if you read enough of my answers here, you'll have read most of the content of the book ;)
  • Memet Olsen
    Memet Olsen over 11 years
    I think 1/3 of my upvotes are on your answers. But still, I'd rather read the book in my spare time instead of reading 22,284 answers :)
  • Jon Skeet
    Jon Skeet over 11 years
    @memetolsen: Yes, it's definitely better organized :)
  • phoog
    phoog over 11 years
    I don't suppose the IL for the anonymous EventHandler example is different whether you include or omit the parameter list, is it? If there's no difference in IL, the lambda might still be preferred as saving keystrokes: delegate{X("");} vs (s,a)=>X("")