黑马程序员技术交流社区

标题: 关于委托的小问题 [打印本页]

作者: 马林康    时间: 2012-7-24 11:14
标题: 关于委托的小问题
委托中delegate 和Delegate类有什么关系?Delegate类怎么用?
作者: 许庭洲    时间: 2012-7-24 11:46
1,委托(Delegate)类是一种数据结构,通过它可引用静态方法或引用类实例及该类的实例方法;
2,Delegate在搭载多个方法时,可以通过+=增加搭载的函数,也可以通过-=来去掉Delegate中的某个函数
3,class Program
    {
        static void OtherClassMethod()
       {
            Console.WriteLine("Delegate an other class's method");
        }

        static void Main(string[] args)
        {
            var test = new TestDelegate();

           //delegateMethod搭载了3个函数
            test.delegateMethod = new TestDelegate.DelegateMethod(test.NonStaticMethod);
            test.delegateMethod += new TestDelegate.DelegateMethod(TestDelegate.StaticMethod);
            test.delegateMethod += Program.OtherClassMethod;

            test.RunDelegateMethods();

        }
    }

    class TestDelegate
    {
        public delegate void DelegateMethod();  //声明了一个Delegate Type,DelegateMethod是类型

        public DelegateMethod delegateMethod;   //声明了一个Delegate对象,delegateMethod是对象

        public static void StaticMethod()  //调用静态方法
        {
            Console.WriteLine("Delegate a static method");
        }

        public void NonStaticMethod()  //调用非静态方法
        {
            Console.WriteLine("Delegate a non-static method");
        }

        public void RunDelegateMethods()
        {
            if(delegateMethod != null)
            {
                Console.WriteLine("---------");
                delegateMethod.Invoke();    //运行被搭载的函数
                Console.WriteLine("---------");
            }
        }
    }
作者: 京鱼龙    时间: 2012-7-24 15:35
delegate可以认为是一种函数的指针,一个delegate类型的实例代表可以代表一个方法,在实际使用中我们可以在不知道方法名称的情况下调用到这个方法。
委托(Delegate)类是一种数据结构,通过它可引用静态方法或引用类实例及该类的实例方法,Ddelegate类是委托类型的基类。

delegate的简单应用:
1.       定义delegate类型
2.       定义一个方法包含要执行的代码
3.       创建一个delegate实例
4.       调用delegate实例

作者: 夏威夷海风    时间: 2012-7-26 19:12
这是我早期写的,不知道对你有没帮助,拿给你看看,委托只有在事件里才能深刻弄明白
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 定义委托
{
    class Program
    {
        //委托是不能定义返回值的;
        delegate void delegateone();//定义了一个不包含参数的委托类型;
        delegate void delegatetwo(params int[] values);//定义了一个包含参数的委托类型;
        static void Methoddelegateone()
        {
            Console.WriteLine("Hello.World" + " " + "!");
        }
        static void Methoddelegatetwo(params int[] values)
        {
            for (int i = 0; i < values.Length - 1; i++)
            {
                for (int j = 0; j < values.Length - i - 1; j++)
                {
                    int temp;
                    if (values[j] <= values[j + 1])
                    {
                        temp = values[j];
                        values[j] = values[j + 1];
                        values[j + 1] = temp;

                    }
                }
            }
            foreach (int i in values)
            {
                Console.Write(i + " ");
            }
            Console.Write("\n");
        }
        static void MethoddelegatetwoAvg(params int[] values)
        {
            int sum = 0;
            for (int i = 0; i < values.Length;i++ )
            {
                sum += values[i];
            }
            Console.WriteLine("总成绩为{0}{1},平均成绩为{0}{2}"," ",sum,(double)sum/values.Length);
        }
        static void Main(string[] args)
        {
            ShowUi();
            
            int number=0;
            Console.WriteLine("请输入你们班级人数?");
            try
            {
                number = Convert.ToInt32(Console.ReadLine());
                if (number<0)
                {
                    MessageBox.Show("人数不能为负数");
                    return;
                }
                else
                {
                    Console.WriteLine("------------------------------------------------");
                }
            }
            catch
            {

                MessageBox.Show("人数只能是数字");
                return;
            }
            int [] score =new int[number];//这里的number必须先定义,赋值再使用;
            for (int i = 0; i < score.Length;i++ )
            {
                Console.WriteLine("请输入第{0}个学生的成绩?",i+1);
                try
                {
                    score[i] = Convert.ToInt32(Console.ReadLine());
                    if (score[i]<0||score[i]>100)
                    {
                        MessageBox.Show("学生成绩不能为负数,也不能大于100");
                        return;
                    }
                    else
                    {

                    }
                }
                catch
                {
                    MessageBox.Show("学生成绩只能是数字!");
                    return;
                }
            }

            delegateone onedelegate = new delegateone(Methoddelegateone);
            delegatetwo twodelegate=null;
            twodelegate+= new delegatetwo(Methoddelegatetwo);
            twodelegate += new delegatetwo(MethoddelegatetwoAvg);

            onedelegate();
            Console.Clear();
            Console.Write("你们班学生成绩最高分——>最低分为:");
            twodelegate(score);
            Console.ReadKey();

         
        }
       static  void ShowUi()
        {
            Console.WriteLine("********************************************");
            Console.WriteLine("**          计算班级学生成绩             **");
            Console.WriteLine("********************************************");
        }
    }
}



using System;

namespace 规范事件委托编码
{
    class Program
    {
        static void Main(string[] args)
        {
            Publish onepublish = new Publish();
            Subscriber zs = new Subscriber("张三");
            Subscriber ls = new Subscriber("李四");
            onepublish.PublishComputer += new Publish.PublishComputerEventHandler(zs.Receive);
            onepublish.PublishComputer += new Publish.PublishComputerEventHandler(ls.Receive);
            onepublish.PublishLife += new Publish.PublishLifeEventHandler(zs.Receive);
            onepublish.PublishLife += new Publish.PublishLifeEventHandler(ls.Receive);
            onepublish.isOnPublishComputer("电脑",Convert.ToDateTime ("2011-01-01"));
            onepublish.isonpublishlife("生活",Convert.ToDateTime("2011-01-01"));
            Console.WriteLine();
            Console.WriteLine("_______________________________________");
            Console.WriteLine("一年以后");
            Console.WriteLine("_______________________________________");
            onepublish.PublishComputer -= new Publish.PublishComputerEventHandler(zs.Receive);
            onepublish.isOnPublishComputer("电脑", Convert.ToDateTime("2012-01-01"));
            onepublish.isonpublishlife("生活", Convert.ToDateTime("2012-01-01"));
            Console.WriteLine();
            Console.WriteLine("_______________________________________");
            Console.WriteLine("过了三年");
            Console.WriteLine("_______________________________________");
            onepublish.PublishComputer -= new Publish.PublishComputerEventHandler(ls.Receive);
            onepublish.PublishLife -= new Publish.PublishLifeEventHandler(zs.Receive);
            onepublish.isOnPublishComputer("电脑", Convert.ToDateTime("2015-01-01"));
            onepublish.isonpublishlife("生活", Convert.ToDateTime("2015-01-01"));
            Console.ReadKey();







        }
    }
    class Publish
    {
       public  delegate void PublishComputerEventHandler(object sender,PubEventAges e);
       public  delegate void PublishLifeEventHandler(object sender,PubEventAges e);
       public event PublishComputerEventHandler PublishComputer;
       public event PublishLifeEventHandler PublishLife;
       protected virtual void onPublishComputer(PubEventAges e)
       {
           PublishComputerEventHandler handler = PublishComputer;
           if (handler !=null)
           {
               handler(this ,e);

           }

       }
       protected virtual void onPublishLife(PubEventAges e)
       {
           PublishLifeEventHandler handler = PublishLife;
           if(handler!=null)
           {
               handler(this ,e);
           }

       }
       public void isOnPublishComputer(string magzaine, DateTime Pubdate)
       {
           Console.WriteLine("发行"+magzaine);
           onPublishComputer(new PubEventAges (magzaine ,Pubdate));
       }
       public void isonpublishlife(string magazine,DateTime pubdate)
       {
           Console.WriteLine("发行"+magazine);
           onPublishLife(new PubEventAges (magazine,pubdate ));

       }

    }
    class PubEventAges : EventArgs
    {
        private readonly string m_magazineName;
        private readonly DateTime m_PubDate;
        public PubEventAges(string magazineName, DateTime PubDate)
        {
            m_magazineName = magazineName;
            m_PubDate = PubDate;
        }
        public string magazine
        {
            get { return m_magazineName; }
        }
        public DateTime pubdate
        {
            get { return m_PubDate; }
        }
    }
    class Subscriber
    {
        private string name;
        public Subscriber(string name)
        {
            this.name = name;
        }
        public void Receive(object sender,PubEventAges e)
        {
            Console.WriteLine(e.pubdate+ name +"收到"+e.magazine);
        }
    }

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2