Delegates (C# Programming Guide)
A delegate is a type that defines a method signature. When you instantiate a delegate, you can associate its instance with any method with a compatible signature. You can invoke (or call) the method through the delegate instance.
Delegates are used to pass methods as arguments to other methods. Event handlers are nothing more than methods that are invoked through delegates. You create a custom method and a class such as a windows control can call your method when a certain event occurs. The following example shows a delegate declaration:
public delegate int PerformCalculation(int x, int y);
Any method from any accessible class or struct that matches the delegate's signature, which consists of the return type and parameters, can be assigned to the delegate. The method can be either static or an instance method. This makes it possible to programmatically change method calls, and also plug new code into existing classes. As long as you know the signature of the delegate, you can assign your own method.
Note
In the context of method overloading, the signature of a method does not include the return value. But in the context of delegates, the signature does include the return value. In other words, a method must have the same return value as the delegate.
This ability to refer to a method as a parameter makes delegates ideal for defining callback methods. For example, a sort algorithm could be passed a reference to the method that compares two objects. Separating the comparison code allows for the algorithm to be written in a more general way.
Delegates Overview
Delegates have the following properties:
Delegates are like C++ function pointers but are type safe.
Delegates allow methods to be passed as parameters.
Delegates can be used to define callback methods.
Delegates can be chained together; for example, multiple methods can be called on a single event.
Methods do not have to match the delegate signature exactly. For more information, see Covariance and ContravarianceCovariance and Contravariance in Delegates (C# Programming Guide).
C# version 2.0 introduced the concept of Anonymous Methods, which allow code blocks to be passed as parameters in place of a separately defined method. C# 3.0 introduced lambda expressions as a more concise way of writing inline code blocks. Both anonymous methods and lambda expressions (in certain contexts) are compiled to delegate types. Together, these features are now known as anonymous functions. For more information about lambda expressions, see Anonymous Functions (C# Programming Guide).
In This Section
When to Use Delegates Instead of Interfaces (C# Programming Guide)
Delegates with Named vs. Anonymous Methods (C# Programming Guide)
Covariance and Contravariance in Delegates (C# Programming Guide)
How to: Combine Delegates (Multicast Delegates)(C# Programming Guide)
How to: Declare, Instantiate, and Use a Delegate (C# Programming Guide)
C# Language Specification
For more information, see the following sections in the C# Language Specification:
1.11 Delegates
4.2.6 Delegate types
7.5.5.3 Delegate invocations
15 Delegates
Featured Book Chapters
Delegates, Events, and Lambda Expressions in C# 3.0 Cookbook, Third Edition: More than 250 solutions for C# 3.0 programmers
Delegates and Events in Learning C# 3.0: Master the fundamentals of C# 3.0
See Also
Concepts
Reference
Change History
Date |
History |
Reason |
---|---|---|
January 2010 |
Updated introduction. |
Customer feedback. |