委托:是一个类、是一种数据类型 定义语法: 访问修饰符 关键字(delegate) 返回值 标识符(参数列表) 委托的绑定:和委托的返回值一样,参数一样的方法都可以绑定到此委托 委托链的使用:通过+=、-=给委托链添加和删除一个绑定方法。 委托使用之前需要先定义 三种使用方式: 1.直接方法赋值使用 2.匿名函数使用: 匿名函数法:delagate + 参数 + 方法体{return 返回值默认值;} 3.Lambda表达式使用: 格式:(参数)=>{} 当只有一个参数,一个返回值的时候,写Lambda表达式时,可以将参数的小括号、参数的类型省略,将方法大括号,return语句的return也省略,语句后的分号也可以省略。
namespace 委托
{
delegate void MyDelegate();
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.SayHello(Fun);
}
static void Fun()
{
Console.WriteLine("xixi");
}
}
class Person
{
public void SayHello(MyDelegate dele)
{
dele();
}
}
}
//创建委托对象
MyDelegate dele1 = new MyDelegate(Fun);
MyDelegate dele2 = Fun;
MyDelegate dele3 = dele1;
//调用委托对象
dele1();
dele2();
dele3();
委托:一个委托对象可以绑定多个方法,只要方法签名和其一致即可以绑定,委托对象在调用时,会依次执行绑定的方法,卸载未曾绑定的方法不会报错.
... ...
ColDelegate col = new ColDelegate(Add);
col += Sub;
col -= Add;
Console.WriteLine(col (5, 10));
}
static int Sub(int a, int b)
{
return a - b;
}
static int Add(int a, int b)
{
return a + b;
}
委托中方法的表现形式 除了常规的表现形式还有匿名函数和Lambda表达式
//匿名函数:delegate(形参列表){}
Person student11 = new Person();
student11.SayHello(delegate () { Console.WriteLine("222"); });
ColDelegate col2 = delegate (int a, int b) { return a / b; };
Console.WriteLine(col2(20,10));
//Lambda 表达式
//省略某些元素:当只有一个参数时,可以只写形参,
//当方法体为一条有返回值的语句,可以省略{}和return 关键字
StrDelegate myStr = (int a) => { return a.ToString(); };
StrDelegate str = a => a.ToString();
通过委托来实现前面的排序,以实现我们可以随意定义两个比较的是什么东西 委托的两个参数为泛型以此来实现,任意类型
delegate bool ComAmyObj<T>(T a,T b);
//对任意可比较类型数据进行升序排序
class MyClass01
{
public T[] ArraySort<T>(T[] t,ComAmyObj<T> comAmyObj) //where T : IComparable
{
if (t.Length > 1)
{
for (int n = 0; n < t.Length; n++)
{
for (int m = 0; m < t.Length - n - 1; m++)
{
//如果前者大于后者
if (comAmyObj(t[m], t[m + 1]))
{
T temp = t[m + 1];
t[m + 1] = t[m];
t[m] = temp;
}
}
}
}
return t;
}
}
class Program
{
static void Main(string[] args)
{
MyClass02[] c1 = new MyClass02[3];
c1[0] = new MyClass02();
c1[0].i = 11110;
c1[1] = new MyClass02();
c1[1].i = 230;
c1[2] = new MyClass02();
c1[2].i = 10;
MyClass01 c3 = new MyClass01();
// c1 = c3.ArraySort<MyClass02>(c1);
c1 = c3.ArraySort<MyClass02>
(c1, (MyClass02 i, MyClass02 j) => { if (i.i > j.i) { return true; } else return false; });
Console.WriteLine(c1[0].i);
Console.WriteLine(c1[1].i);
Console.WriteLine(c1[2].i);
}
}
event是一种定义好的数据类型,对委托对象实现封装,保护委托对象不被直接复制修改。在非声明事件的类,只可以用+=、-=的方式,挂载、卸载事件。 声明语法:访问修饰符 event 委托 名字;