委托、事件和lambda表达式

  • 委托:是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。

委托类型包含3个重要的信息:(方法签名

1.它所调用的方法的名称;

2.该方法的参数(可选);

3.该方法的返回值类型(可选)

.NET委托既可以指向静态方法,也可以指向实例方法。

委托机制所利用的命名空间:System.MulticastDelegate与System.Delegate基类。

using System;

namespace SimpleDelegate
{
    //这个委托可以指向任何传入两个参数并返回一个整数的方法
    public delegate int BinaryOp(int x, int y); //定义委托类型
    public class SimpleMath
    {
        public static int Add(int x, int y){
            return x + y;
        }

        public static int Subtract(int x, int y){
            return x - y;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //创建委托对象
            BinaryOp b = new BinaryOp(SimpleMath.Add);
            //使用委托对象间接调用Add()方法
            Console.WriteLine("使用委托对象--{0}",b(10, 10));
            Console.ReadKey();
        }
    }
}

※如果要将目标对象方法插入指定委托对象,只要向委托的构造函数传入方法名称即可。

  • 泛型委托
using System;

namespace GenericDelegate
{
    //这个泛型委托可以调用任何返回void并接受单个参数的方法
    public delegate void MyGenericDelegate(T arg);
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*** 泛型委托 ***\n");
            //注册目标
            MyGenericDelegate strTarget = new MyGenericDelegate(StringTarget);
            strTarget("Some string data");

            MyGenericDelegate intTarget = new MyGenericDelegate(IntTarget);
            intTarget(9);
        }

        static void StringTarget(string arg){
            Console.WriteLine("arg in uppercase is: {0}", arg.ToUpper());
        }

        static void IntTarget(int arg){
            Console.WriteLine("++arg is: {0}", ++arg);
        }
    }
}

  • 事件

事件:类似于异常,它们都是由对象引发(抛出,达到某种条件触发),并且可以通过我们提供的代码来处理,并且必须订阅它们;订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们称为事件处理程序。

定义一个事件分为两个步骤:1. 需要定义一个委托类型,它包含在事件触发时将要调用的方法;

                                            2. 通过event关键字用相关委托声明这个事件。

  • 匿名方法
  • Lambda表达式

 

 

你可能感兴趣的:(精通C#)