Delegates and events are used a lot in C#, especially when performing form programming. Many operations must be processed and delivered through delegates and events. Here is a detailed explanation of the usage and reasons of delegates and events, so that we can understand it more clearly when writing code.
The use of delegation
Events are a mechanism, and events are implemented through delegation, so if you understand delegation, you will have a better understanding of events. Let’s look at a small example below.
This is the code that describes programmers in different languages:
For example, we describe programmers using C# like this, where the programerName parameter represents the name of the programmer.
public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); }
Use Java,
public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); }
So there are so many languages, how to distinguish which programmer is this? Use an enumeration to represent,
public enum ProgramLanguage { CSharp, C, Java }
Then give a complete description, the code is as follows:
public class ProgramerDescription { //01 public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}使用C语言编程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); } //02 public void Description(string programerName, ProgramLanguage type) { switch (type) { case ProgramLanguage.CSharp: CsharpProgramer(programerName); break; case ProgramLanguage.C: CProgramer(programerName); break; case ProgramLanguage.Java: JavaProgramer(programerName); break; default: Console.WriteLine("A kind of new Language that you never heard of."); break; } } } public enum ProgramLanguage { CSharp, C, Java }
Call:
ProgramerDescription pm = new ProgramerDescription(); pm.Description("杨友山", ProgramLanguage.CSharp);
At this time, output "Yang Youshan uses C# to program! ";
In this way, a simple implementation of the programmer's description is initially completed. The Description method here uses an enumeration type to distinguish different languages. In this way, its maintainability is relatively poor, because there are many programming languages (C++, PHP, etc.). If you want to add a language, you must add a corresponding method, and then you must modify the ProgramLanguage enumeration type. Adding methods will have little impact on the original program, because it can be implemented using partial classes, but modifying the enumeration is not appropriate. This is not in line with the open and closed principle of object-oriented design.
So how to deal with it in the Description method, that is, without enumeration, how does the Description method distinguish which method (CsharpProgramer, CProgramer, JavaProgramer) to call to describe the programmer.
public void Description(string programerName, a certain parameter of a certain type)
{
//Call the corresponding method
}
The certain type here is used to distinguish the type of which method. In other words, it is best if I directly pass the method I want to call as a parameter here. For example, if I want to call the CProgramer method to describe a C programmer,
ProgramerDescription pm = new ProgramerDescription();
pm.Description("D.M.Ritchie", CProgramer);
According to this idea, public string How to express "a certain type and a certain parameter" of Description(string programerName, a certain type and a certain parameter)?
Of course we think of the delegate in C#. A delegate is a data structure that references a static method or references a class instance and the instance methods of that class. Use a delegate to complete the above code:
public class ProgramDescriptionDelegate { //委托,表示方法 public delegate void DescriptionDelegate(string programerName); //01 public void CsharpProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用C#编程!", programerName)); } public void CProgramer(string programerName) { Console.WriteLine(string.Format("{0}使用C语言编程!", programerName)); } public void JavaProgramer(string programerName) { Console.WriteLine(string.Format("{0} 使用Java语言编程!")); } //02 public void Description(string programerName, DescriptionDelegate description) { description(programerName); } }
Call:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); pm.Description("杨友山", pm.CsharpProgramer);
The result is the same as the original code.
What is delegation? MSDN explains it this way: A delegate is a type that defines a method signature, can be associated with any method with a compatible signature, and can be called through the delegate. Delegates are used to pass methods as parameters to other methods. Time handlers are methods called through delegates.
Look carefully at the code using the delegate,
public void Description(string programerName, DescriptionDelegate description). When calling,
DescriptionDelegate description is passed in pm.CsharpProgramer, that is, description=pm.CsharpProgramer at this time. In fact, we can also call it like this:
//方法和委托绑定 ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate csharpDelegate = pm.CsharpProgramer; YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate cdelegate = pm.CProgramer; pm.Description("杨友山", csharpDelegate); pm.Description("D.M.Ritchie", cdelegate);
Result:
Modify again:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pm.Description("杨友山", pdelegate);
Result:
Here, pm.CsharpProgramer is executed first, and then the pm.CProgramer method is executed.
It can be seen that the delegate can not only use methods as parameters, but also bind methods, and it can bind multiple methods.
Use += to bind the method, and use -= to cancel. The above call can be modified as follows:
ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate(); YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate pdelegate = null; pdelegate += pm.CsharpProgramer; pdelegate += pm.CProgramer; pdelegate -= pm.CProgramer; pm.Description("杨友山", pdelegate);
In this way, only one method of pm.CsharpProgramer; is called.
The above is the content of C# basic knowledge compilation Basic knowledge (20) Commission (1). For more related content, please pay attention to the PHP Chinese website (www.php.cn)!