Ok, suppose you define a delegate in some class.
public delegate void StringDelegate (string s);
and another class implements a method :
public static void StringWriter (string s) {...}
In the book that I'm reading "Programming C#" 4th ed they create delegates using the new keyword, ex:
ClassDelegate.StringDelegate writer;
writer = new ClassDelegate.StringDelegate (DelegateImplementer.StringWriter);
writer("Hello");
However, I see one can also call the delegate method this way
ClassDelegate.StringDelegate writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");
What's the difference? Why do I want instantiate and create an object delegate when I can just simply pass or make reference to the signature of the method delegate.
There is absolutely no difference between the two statements. writer = DelegateImplementer.StringWriter;
still creates a delegate
object; the compiler will generate the new ClassDelegate.StringDelegate ()
for you. It's just a cleaner syntax that was added in C# 2.0.
As @Ben Voigt mentioned in his answer is only required in C# 2.0 where the compiler can't deduce the type of the delegate, when using Control.Invoke() for example.
Sometimes the correct type can't be deduced (like when you're calling a generic), in such a case you need to let the compiler know what kind of delegate you want.
Most of the time, though, naming the method group is easier and clearer.
The two are equivalent. The latter is syntax new with C# 2.0.
Both are the same, but the latter syntax was added in C#2 to simplify delegate usage.
Both methods compile to the same byte code.
It's syntactic sugar. Ultimately both sets of code do the same thing.
I'd also note that .Net has a bunch of generic delegates built in that can save you alot of coding. In this case I'd do:
Action<string> writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");
This way you don't even need to create your own delegate.