http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4292|回复: 4

[C#语言基础] 委托和事件的使用。请分析一下使用事件的优势

[复制链接]
发表于 2013-10-30 23:58:51 | 显示全部楼层 |阅读模式
本帖最后由 虎耳草。 于 2013-10-31 00:07 编辑

我是初学者。模仿者着站长的教程按照自己的理解写的代码 。
我想知道以下两种方法的优劣势 为何非得用事件封装委托

代码见楼下,希望大家帮忙。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-10-31 00:06:28 | 显示全部楼层
代码段一:使用委托和事件
[code=csharp]namespace shaoshui
{
    public class heat
    {
        public delegate void boil(int temp);
        public event boil heater;
        private int wendu=0;
        public void boilwater()
        {
            for (int i = 0; i <= 100; i++)
            {
                wendu = i;
                if (wendu > 95)
                {
                    if (heater != null)
                    {
                        heater(wendu);
                    }
                }
            }
        }
    }

    public class show
    {
        public void show1(int temp)
        {
            Console.WriteLine("水开了!快{0}度了",temp);
        }
    }

    public class display
    {
       public static void display1(int temp)
        {
            Console.WriteLine("嘀嘀嘀!已经{0}度了", temp);
        
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            heat heat1 = new heat();
            show show1 = new show();
            heat1.heater += show1.show1;
            heat1.heater += display.display1;
            heat1.boilwater();
            Console.ReadKey();
           
        }
    }
}


代码段二仅使用委托
[/code][code=csharp]namespace 委托6
{
     public delegate void boil(int temp);
     public class heat
    {
        //public delegate void boil(int temp);
        //public event boil heater;
        private int wendu;
        public boil heater;
        public void boilwater()
        {
            for (int i = 0; i <= 100; i++)
            {
                wendu = i;
                if (wendu > 95)
                {
                    if (heater != null)
                    {
                        heater(wendu);
                    }
                }
            }
        }
    }

    public class show
    {
        public void show1(int temp)
        {
            Console.WriteLine("水快开了!快{0}度了",temp);
        }
    }

    public class display
    {
       public static void display1(int temp)
        {
            Console.WriteLine("嘀嘀嘀!已经{0}度了", temp);
        
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            heat heat1 = new heat();
            show show1 = new show();
            heat1.heater = show1.show1;//为委托绑定方法
            heat1.heater += display.display1;
            heat1.boilwater();//等价于为方法附上实参
            Console.ReadKey();
           
        }
    }
}


[/code]



发表于 2013-10-31 08:22:20 | 显示全部楼层
你说反了吧,应该是委托绑定事件吧,委托就是代为执行,,,的

他不但但是这种情况下,更重要的是他可以跨线程执行,如果是你在一个子线程中直接去更新主线程的界面,是不方便 的,但是如果你直接使用委托就不一样的,

不但方便而且还可以实现时时同步的效果,具体参考这里
http://www.sufeinet.com/forum.php?mod=viewthread&tid=3556

如果单看你这里的话,最方便的是委托可以把一个方法做为参数,这样的话你就可以在执行时动态调用方法,动态的选择事件,而不需要写那么多的If或者是Case语句下完成
 楼主| 发表于 2013-10-31 18:40:38 | 显示全部楼层
站长苏飞 发表于 2013-10-31 08:22
你说反了吧,应该是委托绑定事件吧,委托就是代为执行,,,的

他不但但是这种情况下,更重要的是他可以 ...

谢谢站长提醒

发表于 2013-11-1 09:18:12 | 显示全部楼层
你搜索下C#事件与委托经典讲解,当时也是费了好多神看这个~有个完整版本的word文档,讲到C#委托,事件等。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-15 14:20

© 2014-2021

快速回复 返回顶部 返回列表