When to Use Delegates Instead of Interfaces (C# Programming Guide)
Both delegates and interfaces allow a class designer to separate type declarations and implementation. A given interface can be inherited and implemented by any class or struct; a delegate can created for a method on any class, as long as the method fits the method signature for the delegate. An interface reference or a delegate can be used by an object with no knowledge of the class that implements the interface or delegate method. Given these similarities, when should a class designer use a delegate and when should they use an interface?
Use a delegate when:
-
An eventing design pattern is used.
-
It is desirable to encapsulate a static method.
-
The caller has no need access other properties, methods, or interfaces on the object implementing the method.
-
Easy composition is desired.
-
A class may need more than one implementation of the method.
Use an interface when:
-
There are a group of related methods that may be called.
-
A class only needs one implementation of the method.
-
The class using the interface will want to cast that interface to other interface or class types.
-
The method being implemented is linked to the type or identity of the class: for example, comparison methods.
One good example of using a single-method interface instead of a delegate is IComparable or IComparable. IComparable declares the CompareTo method, which returns an integer specifying a less than, equal to, or greater than relationship between two objects of the same type. IComparable can be used as the basis of a sort algorithm, and while using a delegate comparison method as the basis of a sort algorithm would be valid, it is not ideal. Because the ability to compare belongs to the class, and the comparison algorithm doesn’t change at run-time, a single-method interface is ideal.
- 11/10/2010
- visiontechno
+to
Edit by SJ at MSFT: That typo (which I almost always enter as "type") was caught and corrected in Visual Studio 2008 (http://msdn.microsoft.com/en-us/library/ms173173(VS.90).aspx). Thanks for your input.
- 6/8/2010
- sscout
- 7/16/2010
- SJ at MSFT
CS Team: This is fixed in later versions of the documentation. Thanks.
- 10/18/2009
- djd1960
- 4/30/2010
- SJ at MSFT
The line " a delegate can created for a method on any class" must be read as " a delegate can be created for a method on any class"
CSTeam: This has been fixed in later versions of the documentation. Thanks.
- 6/12/2009
- SawGeo
- 4/30/2010
- SJ at MSFT
CSTeam: This sentence is fixed in later versions of the documentation. Thanks.
- 4/28/2009
- danielcohee
- 4/30/2010
- SJ at MSFT