重读C#高级编程之委托and事件

  曾经有过一次面试,要写:"猫叫,老鼠跑,主人醒"的程序,只记得要考察委托和事件,却没能写出来。
  用委托和事件来处理当然很方便,但是现在象这样的问题,都会用到设计模式(观察者模式)来处理。自然是从灵活度上来考虑。因为不懂设计模式,暂时就简单的复习一下Delegate and Event吧~
  Delegate实际上一个class,所以可以在定义class的任何地方定义delegate;说其类型安全,自然跟其定义方式有关:定义了代理方法体的详细细节(返回类型,参数列表),这样在使用的时候就能在编译阶段发现error. 我们使用代理,是因为它默认有一个参数:方法体名称,也就是可以通过Delegate来把方法当作参数传递。
  Event自不必多说,但有一点必须注意:所有的事件是通过代理来激活的。这也就是为什么Delegate和Event结合这么紧密的原因.实际上查看控件已经定义好的Delegate和Event,我们也可以看出其作用和用法:如,Button 的Click事件,查看相关定义,metadata,可以看到:
 this.button1.Click += new System.EventHandler(this.button1_Click);

public delegate void EventHandler(object sender, EventArgs e);

public event EventHandler Click;
很明显:首先定义EventHandler delegate,而后定义委托事件Click, then,在click事件触发的时候执行事件处理程序:button1_click;
  Demo:猫叫,老鼠跑,主人醒
using System;
using System.Collections.Generic;
using System.Text;

namespace ConstructorDemo
{
    
class Cat
    
{
        
public delegate void CryEventHandler(object o,EventArgs e); //声明Delegate
        public event CryEventHandler Cry;                           //定义Event
        private string m_name;
        
public Cat(string name)
        
{
            m_name 
= name;
        }

        
public void OnCry()
        

            
if (Cry != null)
            
{
                Cry(
this,EventArgs.Empty);          //触发事件
            }

        }

    }

    
public class Master
    
{
        
private string m_name;
        
public Master(string name)
        
{
            m_name 
= name;
        }

        
public void Response(object o, EventArgs e)
        
{
            Console.WriteLine(m_name
+"wake up");
        }

    }


    
public class Mouse
    
{
        
private string m_name;
        
public Mouse(string name)
        
{
            m_name 
= name;
        }

        
public void Response(object o, EventArgs e)
        
{
            Console.WriteLine(m_name
+"flee away");
        }

    }

}

namespace PInvokeDemo
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
            ConstructorDemo.Cat cat 
= new ConstructorDemo.Cat("cat1");
            ConstructorDemo.Master ma 
= new ConstructorDemo.Master("ivan");
            ConstructorDemo.Mouse ms 
= new ConstructorDemo.Mouse("jerry");
            cat.Cry
+=new ConstructorDemo.Cat.CryEventHandler(ms.Response); //为事件添加事件处理程序
            cat.Cry +=new ConstructorDemo.Cat.CryEventHandler(ma.Response);
            cat.OnCry();       
//猫叫
        }

    }

}
Delegate的应用肯定不止这些,只是暂时还真不清楚具体在什么地方应用。等有机会再详细总结.

posted on 2008-06-12 10:27  easy2Dev  阅读(322)  评论(0编辑  收藏  举报

导航