Compilation of C# basic knowledge Basic knowledge (20) Delegation (1)

黄舟
Release: 2017-02-11 13:59:48
Original
1304 people have browsed it

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));
        }
Copy after login

Use Java,

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }
Copy after login

So there are so many languages, how to distinguish which programmer is this? Use an enumeration to represent,

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }
Copy after login

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
    }
Copy after login

Call:

            ProgramerDescription pm = new ProgramerDescription();

            pm.Description("杨友山", ProgramLanguage.CSharp);
Copy after login

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);
        }
    }
Copy after login

Call:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            pm.Description("杨友山", pm.CsharpProgramer);
Copy after login

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);
Copy after login

Result:

Modify again:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pm.Description("杨友山", pdelegate);
Copy after login

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);
Copy after login

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)!


source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!