码迷,mamicode.com
首页 > 其他好文 > 详细

委托,事件

时间:2015-03-19 21:42:00      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

委托:delegate是表?将?法作为参数传递给其他?法。委托类似于函数指针,但与函数指针不同的是,委托是?向对象
   的、类型安全的和保险的。 委托既能引?静态?法,也能引?实例?法。

   委托是?个类,它定义了?法的类型,使得可以讲?法当做另??法的参数来进?传递,这种将?法动态地赋给参
   数的做法,可以避免在程序中?量使?IF-Else( Switch)语句,同时使程序具有更好的可扩展性。

    委托对象的?个有?属性是:可以使? + 运算符将多个对象分配给?个委托实例。多播委托包含已分配委托的
    列表。 在调?多播委托时,它会按顺序调?列表中的委
    托。 注意: 只能合并相同类型的委托。

 

    当使?事件设计模式时。
    当封装静态?法可取时。
    当调??不需要访问实现该?法的对象中的其他属性、?法或接?时。
    需要?便的组合
    当类可能需要该?法的多个实现时。

     委托的声明原型如下:
  delegate <函数返回类型> <委托名> (<函数参数>)
     委托的使?分以下三步:
      1.委托声明
      2.委托实例化

      3.委托的调用
      

class Program
    {
        public delegate void Greeting(string name);
        public static void EnglishGreeting(string name)
        {
            Console.WriteLine("Good morning!~" + name);
        }
        public static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好!~" + name);
        }

        static void Main(string[] args)
        {
            Greeting greet;
            greet = ChineseGreeting;
            greet += EnglishGreeting;
            greet("张三");

            Greeting gre = new Greeting(ChineseGreeting);
            gre += EnglishGreeting;
            gre("张三");
  
        }
    }

 

 

事件:类或对象可以通过事件向其他类或对象通知发?的相关事情。 发送(或引发)事件的类称为“发?者”,接收(或处理)事件的类称为“订户”。
注意: C#事件本质就是对消息的封装。

由来:委托在某种程度上,破坏了对象的封装性。委托第?个?法注册?的是“=”,是赋值语句,因为要进?实例
   化,第?个?法注册的时候?的是“+=”。但是,不管是赋值还是注册,都是将?法绑定到了委托上,除了调?
   时的先后顺序不同,在没有任何的区别。这样使?起来很别扭,于是event,出场了!

   是事件封装了委托类型的变量,相当于为委托类型量?定制的属性( Property)。
优点:在类的内部,不管声明它是public还是protected,他总是private的。
   在类的外部,注册“+=”和注销“-=”的访问限定符与声明事件时使?的访问限定符相同。

class Program
    {
        
        public delegate void Greeting(string name);
        public class GreetingManger
        {
            public event Greeting MakeGreet;
            public void GreetPeople(string name)
            {
                MakeGreet(name);
            }
        }

        public static void EnglishGreet(string name)
        {
            Console.WriteLine("Good Morning!~" + name);
        }
        public static void ChineseGreet(string name)
        {
            Console.WriteLine("早上好!" + name);
        }

        static void Main(string[] args)
        {
            
            GreetingManger gre = new GreetingManger();
            gre.MakeGreet += EnglishGreet;
            gre.MakeGreet += ChineseGreet;
            gre.GreetPeople("张三");

        }
    }

 

 

c#阶段至此基本上就告一段落了       接下来是地狱 U-3D  

有点小激动呢

委托,事件

标签:

原文地址:http://www.cnblogs.com/little-sun/p/4351752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!