委托和事件匿名委托

 public delegate void maojiaodelegate (object Sender, EventArgs e);
    /// <summary>
    /// 触发对象 观察者 人醒来
    /// </summary>
    public class BigMaster
    {
         private Mao _cat;
         public BigMaster(Mao cat)
        {
            _cat = cat;
            _cat.onjiao += new maojiaodelegate(onxinglaile);
        }
         public void onxinglaile(object Sender, EventArgs e)
        {
            xinglaile();
        }
        public void xinglaile()
        {
            Console.WriteLine("xinglai");
        }
    }
    /// <summary>
    /// 事件引发者 被观察者 猫叫
    /// </summary>
    public class Mao
    {
        public event maojiaodelegate onjiao;
        public void catjiao( EventArgs e)
        {
            if (onjiao != null)
            {
                onjiao(this, e);
            }
        }

        public void catjiao()
        {
           //
            Console.WriteLine("jiao");
           EventArgs e=new EventArgs();
           catjiao(e);

        }

    }
    /// <summary>
    /// 触发对象 观察者 老鼠跑了
    /// </summary>
    public class Lashu
    {

        private Mao _cat;
        public Lashu(Mao cat)
        {
            _cat = cat;
            _cat.onjiao += new maojiaodelegate(onrunningla);
        }
        public void onrunningla(object Sender,EventArgs e)
        {
            runningla();
        }
        public void runningla()
        {
            Console.WriteLine("pao");
        }
    }
            Mao mao = new Mao();
            mao.catjiao();
            BigMaster p = new BigMaster(mao);
            Lashu lao = new Lashu(mao);
Demo 委托

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 using System;
using System.Collections.Generic;
using System.Text;

namespace DelegateDemo
{
    class Class1
    {
        delegate double processDelegate(double db1, double db2);
        static double Multiply(double db1, double db2)
        {
            return db1 * db2;
        }
        static double Divide(double db1, double db2)
        {
            return db1 / db2;
        }
        static void NamedMethod(string strInput,double dbNum1,double dbNum2)
        {
            processDelegate process;
            if (strInput == "M")
                process = new processDelegate(Multiply);
            else
                process = new processDelegate(Divide);
            Console.WriteLine("结果为:{0}", process(dbNum1, dbNum2));

        }       //匿名的方法
        static void AnonymousMethod(string strInput, double dbNum1, double dbNum2)
        {
            processDelegate process;
            if (strInput == "M")
                process = delegate(double db1, double db2){return db1 * db2;};
            else
                process = delegate(double db1, double db2) { return db1 / db2; };
            Console.WriteLine("结果为:{0}", process(dbNum1, dbNum2));

        }
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            Console.WriteLine("请输入两个小数,用逗号分割");
            string strInput = Console.ReadLine();
            int commmaPos = strInput.IndexOf(‘,‘);
            double dbNum1 = Convert.ToDouble(strInput.Substring(0, commmaPos));
            double dbNum2 = Convert.ToDouble(strInput.Substring(commmaPos + 1));
            Console.WriteLine("输入M表示乘法,或者D表示除法");
            strInput = (Console.ReadLine()).ToUpper();
            //使用命名方法
            Console.WriteLine("使用命名方法委托");
            NamedMethod(strInput,dbNum1,dbNum2);
            //使用匿名方法
            Console.WriteLine("使用匿名方法委托");
            AnonymousMethod(strInput, dbNum1, dbNum2);  

        }
    }

}

委托实例:http://www.cnblogs.com/liulun/archive/2009/10/25/1589523.html

http://www.cnblogs.com/liulun/archive/2009/05/29/1491912.html

事件多播:http://www.cnblogs.com/liulun/archive/2009/09/24/1573571.html

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace xiancheng
{
    class Program
    {
        delegate void mytest(int a,int b);
        static void Main(string[] args)
        {

            mytest tee = delegate(int x,int y) {
                int result = x + y;
                Console.WriteLine("这是匿名委托用法结果是:  "+result);
            };
            tee(2, 8);
            mytest tee2 = new mytest(getresult);
            tee2(9,8);

            //拉姆达
            mytest tee3 = (x,y)=>
            {
                int result = x + y;
                Console.WriteLine("这是拉姆达匿名委托用法结果是:  " + result);
            };
            tee3(88, 12);
            Console.ReadKey();
        }
        public static void getresult(int x, int y)
        {
            int result = x + y;
            Console.WriteLine("这不是匿名委托方法使用结果是:  "+result) ;
        }

    }
}

输出 10,17,100

 9.Lambda表达式

    (1)源起

      .net的设计者发现在使用匿名方法时,

      仍旧有一些多余的字母或单词的编码工作

      比如delegate关键字

      于是进一步简化了匿名方法的写法

    (2)使用      

            List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
            arr.ForEach(new Action<int>(delegate(int a) { Console.WriteLine(a); }));
            arr.ForEach(new Action<int>(a => Console.WriteLine(a)));

      匿名方法的代码如下:

      delegate(int a) { Console.WriteLine(a); }

      使用lambda表达式的代码如下:

      a => Console.WriteLine(a)

      这里解释一下这个lambda表达式

      <1>

        a是输入参数,编译器可以自动推断出它是什么类型的,

        如果没有输入参数,可以写成这样:

        () => Console.WriteLine("ddd")

      <2>

        =>是lambda操作符

      <3>

        Console.WriteLine(a)是要执行的语句。

        如果是多条语句的话,可以用{}包起来。

        如果需要返回值的话,可以直接写return语句

时间: 2024-07-30 04:32:17

委托和事件匿名委托的相关文章

13委托和事件

1.委托是什么? 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是 int.string.类类型 void M1(int n){ }        √ void M2(string s){ }    √ void M3(Person p){ }    √ 那么能不能把方法也作为参数进行传递? 委托就是一种数据类型,用来存放方法的了数据类型 委托的声明方式:delegate 返回值类型 委托的名(参数) 存储什么样的方法就声明什么类型(方法参数与返回值)的委托. 声明的委托是一

C# 事件和委托

1 public class Heater { 2 private int temperature; 3 public string type = "RealFire 001"; // 添加型号作为演示 4 public string area = "China Xian"; // 添加产地作为演示 5 //声明委托 6 public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e)

委托与匿名委托

本来是想写一篇<委托与lambda表达式的前世今生>,但仅委托部分已经写了很多内容,于是就此分开关于Lambda表达是的内容后续再写吧. 不知道Lambda表达式是谁发明的,只记得第一次接触Lambda表达式是在使用VS2008的时候,那就先认为是微软发明的吧. Lambda表达式从我接触开始到现在变得越来越流行,Java8中开始支持.kotlin更是对C#,F#做了广泛的抄袭(C#曾几何时不也如此对待过Java嘛).其实这都充分说明了,Lambda表达式的重要性.要搞清楚Lambda首先需要

个人总结:匿名委托+内置委托+Lambda表达式

匿名委托+内置委托+Lambda表达式 概要 在实际开发中,项目开发框架不同,用到的技术是不一样的,这里总结一下用Linq开发,ORM之EF开发会大量使用的Lambda表达式; 正文 之前提过.Net有一套扩展在IEumberable<T>泛型接口的扩展方法,本文是从这个基础继续总结; 1.void Action<in T>: 先拿一个ForEach()来讲: public void ForEach(Action<T> action); 这个Action<T>

c# 匿名方法(函数) 匿名委托 内置泛型委托 lamada

匿名方法:通过匿名委托 .lamada表达式定义的函数具体操作并复制给委托类型: 匿名委托:委托的一种简单化声明方式通过delegate关键字声明: 内置泛型委托:系统已经内置的委托类型主要是不带返回值的Action<T1,,,,Tn>和带返回值的Func<T1,,,Tn,Tresult> 实例代码 class demoFunc { /// <summary> /// 定义函数单条语句直接用lamada表达式 /// </summary> /// <p

C#学习:委托、事件、匿名方法

一.委托: 委托给我的感觉就是一个种类型,可以让方法更具面向对象的特性——你看,其实我也没说明白,因为我也不大理解.还是一步步往下学吧. 具体来说,委托就是一个类似下面的这种东西: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleTestCsharp { class Program { d

C#动态创建两个按钮,btn2复制btn1的Click事件,匿名委托

现在有一个按钮btn1,要动态创建出一个btn2,需要btn2点击时调用btn1的点击. 在delphi中这种操作很简单:btn2.onClick:=btn1.onClick,因为onClick就是个属性,和name.width.height一样. 但是c#不能直接访问,这就麻烦了, 匿名委托,例子: //循环把所有菜单条目加到左侧 Image img=null, imgDefaultDa = null, imgDefaultXiao = Image.FromFile(s + "菜单小项.png

委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件

1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数. [csharp] view plaincopy class Program { delegate int CalculateDelegate(int a, int b); int add(int a, int b) { return a + b; } s

C#学习之初步理解委托、事件、匿名方法和Lambda

最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对,请大家多多指教! 第一部分:理解委托 委托委托,顾名思义,就是类似于中间人的意思,有些事情你不做,委托别人去做,比如你想相亲,但你不想去主动约女孩子,那你可以交给媒婆去帮你约. 如果你学过C++,请把委托理解成函数指针,都是为了调用函数.函数指针可以调用符合该函数指针要求的函数.什么叫符合该函数指