旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C#基础知识整顿 基础知识(20) 托付(一)【C#.Net教程】,C#,基础知识整理,委托

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:35评论:0


导读:托付和事宜在C#中运用许多,尤其在举行窗体编程时,许多的操纵都要经由过程托付和事宜来处置惩罚和通报。这里细致诠释下托付和事宜的用法和缘由,使我们在写代码时能越发邃晓一些。托付的...
托付和事宜在C#中运用许多,尤其在举行窗体编程时,许多的操纵都要经由过程托付和事宜来处置惩罚和通报。这里细致诠释下托付和事宜的用法和缘由,使我们在写代码时能越发邃晓一些。
托付的运用
事宜是一种机制,事宜是经由过程托付完成的,所以看邃晓了托付,关于事宜也就能够更好的理解了。先看下面一个小例子。
这是形貌差别言语的顺序员的代码:
比方运用C#的顺序员我们如许形貌,个中programerName参数示意这个顺序员的姓名。

        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 运用C#编程!", programerName));
        }

运用Java的,

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

那末这么多言语,怎样辨别这是哪一个顺序员呢?运用一个罗列来示意,

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }

那末举行一个完全的形貌,代码以下:

   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
    }

挪用:

            ProgramerDescription pm = new ProgramerDescription();

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

这时候,输出"杨友山 运用C#编程!";
如许就开端完成了一个对顺序员形貌的简朴完成。这里的Description要领是经由过程一个罗列范例来区分差别的言语。如许它的保护性是比较差的,由于另有许多编程言语(C++,php,等),假如想加一种言语就要增添一个对应的要领,然后就要修正ProgramLanguage这个罗列范例。增添要领对原顺序影响不大,由于能够用分部类来完成,而修正罗列就不适宜了,这也不符合面向对象设想头脑的开放关闭准绳。
那末在Description要领中怎样处置惩罚呢,也就是不必罗列了,Description要领如何来辨别该挪用哪一个要领(CsharpProgramer,CProgramer,JavaProgramer)对顺序员举行形貌。
public void Description(string programerName, 某范例 某参数)
{
//挪用对应的要领
}
这里的某范例就是要用它来区分哪一个要领的范例,换句话说,最好就是在这里我直接把我想要挪用的要领当作参数传进去。比方我要挪用CProgramer要领来形貌C顺序员,
ProgramerDescription pm = new ProgramerDescription();

pm.Description("D.M.Ritchie", CProgramer);
根据这个主意,public string Description(string programerName, 某范例 某参数)的“某范例 某参数”该怎样示意呢?
固然我们就想到C#中的托付delegate了。托付是一种数据结构,它援用静态要领或援用类实例及该类的实例要领。 用托付来完成上述的代码:

    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);
        }
    }

挪用:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

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

效果是和最最先的代码是一样的。
什么是托付?MSDN如许诠释的:托付是一种定义要领署名的范例,能够与具有兼容署名的任何要领关联,能够经由过程托付挪用要领。托付用于将要领作为参数通报给其他要领。时候处置惩罚顺序就是经由过程托付挪用的要领。

仔细看运用托付的代码,
public void Description(string programerName, DescriptionDelegate description)。挪用时,
DescriptionDelegate description传入的是 pm.CsharpProgramer,也就是此时description=pm.CsharpProgramer。实在我们还能够如许挪用:

                    //要领和托付绑定
            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);

效果:

再做修正:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

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

效果:

这里先执行了pm.CsharpProgramer,然后又执行了pm.CProgramer要领。
能够看出托付不光能够将要领作为参数,而且还能够将要领绑定,而起还能够绑定多个。
运用+=绑定要领,作废则运用-=举行作废,上面的挪用能够修正以下:

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pdelegate -= pm.CProgramer;

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

如许就只挪用pm.CsharpProgramer;一个要领了。

以上就是C#基础知识整顿 基础知识(20) 托付(一)的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:C#基础知识整理委托


欢迎 发表评论: