• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C#基础知识整理 基础知识(20) 委托(一)

c# 搞代码 4年前 (2022-01-09) 28次浏览 已收录 0个评论

委托和事件在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                csh<div>本文来源gaodai.ma#com搞##代!^码7网</div>arpDelegate = 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) 委托(一)的内容,更多相关内容请关注搞代码(www.gaodaima.com)!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:C#基础知识整理 基础知识(20) 委托(一)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址