您的位置:首页 > 编程语言 > C#

c# 委托

2017-08-30 14:26 183 查看
在c#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象

在我们使用委托的时候,也需要经过两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法

然后创建该委托的实例

定义委托方法如下:

public delegate string GetAString();

定义了一个委托叫GetAString(); 带有一个int参数 返回值为void

委托的使用:

GetAString myString = new GetAString(x.ToString);

string s = mystring()  //通过委托实例去调用方法

把 方法赋值给委托类型变量

GetAString myString = x.ToString;

string s = myString.Invoke(); 

委托类型可以作为一个方法的参数去传递

public delegate void printString();

static void PrintStr(printString a)

 {

     a();

 }

static void Method1()

  {

      Console.WriteLine("Method1");

  }

使用:

printString method = new printString(Method1);

PrintStr(method);

使用Action委托:没有返回值没有参数的返回值

Action A = voidUse;   传递一个没有参数的函数

Action<int,int> B = intUse;  传递具有两个int的参数

Action<string> C = stringUse; 传递具有一个string参数的

使用Func委托类型:带有返回值类型

Func<int> B = FuncA;   //返回值是int 没有参数的函数委托

Func<int, int> C = FuncB;  //有一个int参数 返回值是int的函数委托

Func<int, int, String> D = FuncC;   //有两个参数 返回值是string的函数委托

使用案例:对任何类型的数组进行排序:

(1)使用泛型

static void MaoPao<T>(T[] array, Func<T,T,bool> Compare)  //T可以是任何类型 包括类

(2)自定义比较方法:在类中定义比较方法

public static bool Compare(Employee A, Employee B)

        {

            if (A.salary > B.salary)

                return true;

            else

                return false;

        }

这里实现了按照薪水进行比较

(3)在排序内部调用比较方法:传递委托函数作为参数

Func<T,T,bool> Compare

(4)调用函数:

 MaoPao<类名>(类成员数组, 类名.比较函数);

多播委托:一个委托调用多个方法

 Func<int,int> A = null;

 A += Method1;  添加一个函数

 A += Method2;  添加一个函数

函数会按照添加顺序逐个执行,如果一个函数中断 后面的都不会执行

防止中断的方法:

foreach (var a in A.GetInvocationList())

   {

          a.DynamicInvoke(30);

   }

    Console.ReadKey();

匿名方法:

本质上是一个方法 实际上没有名字 任何使用委托变量的地方可以用匿名方法赋值

Func<int, int, int> ABC = delegate (int a, int b)

       {

                return a + b;

      };

lambda函数:匿名函数的简化:

 Func<int, int, int> plus = (a, b) =>    

 {

        return a + b;

 };

不用传一个具体函数 直接在这里完成函数

当函数参数只有一个的时候,可以不写return和大括号

Func<int, int> plus100 = a => a + 100;

事件:

事件基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托

事件是类或对象向其他类或对象通知发生事情的一种特殊签名的委托

事件的声明:

public event 委托类型 事件名

返回值是一个委托类型

public delegate void MyDelegate();

public event MyDelegate delegateone;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: