using System;
委托:
1.
private delegate String GetString(); 委托是一个类型,这个类型可以赋值一个方法的引用
int x=40;
GetString a=new GetString(x.ToString);
String s=a();
2.
GetString a=x.ToString;
String s=a.Invoke();
委托类型可以作为方法的参数
Action:
Action是系统内置的委托,是一个没有返回值,没有参数的类型
Action<int> 代表没有返回值,有一个int参数的类型
Action<int,int> 代表没有返回值,有两个int参数的类型
Action后面的泛型,代表委托方法里头的参数与泛型保持一致
Func:
Func是系统内置的委托,是有一个返回值,没有参数的类型
Func<int> a 这代表有一个int返回值,没有参数的类型
Func<int,string>这代表有一个string返回值,一个int参数的类型
Func后面的泛型最后指的是返回值类型,前面的指的是参数类型,可以写0-16个参数类型
int类型的冒泡排序:
private bool swapped=true;
void Sort(int[] intArray)
do
{
swapped=false;
for(int i=0;i<intArray.Length-1;i++)
{
if(intArray[i]>intArray[i+1])
{
int temp=intArray[i];
intArray[i]=intArray[i+1];
intArray[i+1]=temp;
swapped=true;
}
}
{while(swapped);
其他类型的排序:
public void EmployeeSort<T>(T[] SortArray,Func<T,T,int> CompareMethod)
{
bool swapped = true;
do
{
swapped = false;
for (int i = 0; i < SortArray.Length - 1; i++)
{
if (CompareMethod(SortArray[i],SortArray[i+1])>0)
{
swapped = true;
T temp = SortArray[i];
SortArray[i] = SortArray[i + 1];
SortArray[i + 1] = temp;
}
}
} while (swapped);
}
多播委托:
Action a=Text1;
a+=Text2; 添加一个委托
a-=Text2; 减少一个委托
a.GetInvocationList() 得到所有的委托
a.DynamicInvoke(); 输出委托
匿名方法:
每一个委托都可以直接用匿名方法赋值,匿名方法本质上是一个方法,只是没有名字,任何使用委托变量的地方都可以使用匿名方法赋值
Func<int,int,int> a=delegate(int arg1,int arg2)
{
return arg1+arg2;
};
Lambda表达式:
Lambda表达式是可以替代匿名方法的,也是一种方法
Func<int,int,int> a=(arg1,arg2)=>
{
return arg1+arg2;
};
如果委托参数只有一个的话,可以省略小括号,如果返回值只有一句话,可以不用花括号和return
Func<int,int> a=arg1=>arg1+1;
事件:
public delegate void MyDelegate;
public event MyDelegate eventDelegate;
观察者设计模式:
在被观察者中设立一个委托,在很多观察者中注册委托方法
通过调用委托就不用修改被观察者的代码了,直接修改委托的+-;
事件只能在类的内部使用,不能再类的外部使用,防止在其他类触发委托
public event Action CatCome; 声明一个事件,发布一个消息
在一个类发布委托或事件,其他的类中注册,利用这个委托调用其他类的方法