想把方法当成方法的参数进行传递,方法不能作为方法的参数,所以就有了委托。
委托的语法:
1、声明委托类型:Delegate int DelMath(int a,int b)
委托和类在同一层级。
2、定义委托对象,让委托指向方法
DelMath del=new DelMath(Add);
省略写法: DelMath del=Add;
再省:直接将Add写进方法中去。
Static int Add(int a,int b){
Return a+b;
}
3、调用委托
Int n=del(1,2);
委托调用2:
Int n=Test(1,2,del);
Static int Test(int n1,int n2, Delegate del){
Return del(n1,n2);
}
匿名方法:仅用一次,返回值直接给委托。
DelMath del=delegate(string str){console.writeline(str)};
求最大值,两个示例。
多播委托:委托可以指向多个或一个方法。
Del=add;
委托可以添加:Del+=Minus;
委托也可以移除:del-=Minus;
多播委托按顺序执行各个方法,如有返回值会指向最后一个方法的返回值。
所以,经常使用多播委托,一般都返回为void。
委托实质是一个类。
delMath del=add;
int a=del(1,2);等价于int a=del.Invoke(1,2);
多播委托就是一个委托数组,依次调用。
窗体间传值:
原方法:在初始化时,对窗体2的构造方法,建立一个参数进行传值。
当窗体2 给窗体1传值时,不能用new构造,怎么办?
总结:窗体传值,你要给主窗体写参数,但是你主窗体没参数,你就需要通过传递一个方法去次窗体,让次窗体不断的给主窗体赋值。
要定义委托:delegatevoid DelShowMsg(string msg);
多线程:
1、 ThreadStart给线程传递的方法属于委托,要求该方法无参数,无返回值!!!
2、 ParameterizedThreadStart也属于委托,无返回值,有参数,但参数必须为object类型。
报错:线程间操作无效。原因:至少有两个线程。
在确保正确的前提下,可以使用control.checkxxxxxxxxxxxxxxxxxcalls=false;不检查跨线程操作合法性。
解决方案:设置全局变量线程名,在窗体关闭时,使用全局变量,关闭次线程。
线程同步: