一些小概念,防止自己太久不用忘记了
事件委托:
Action <int, int, string ….(max number of 16 parameters )> a
永远没有返回值,最多16个泛型输入参数
e.g.:
Static void PrintStr(string str){
Console.WriteLine(str);
}
Action
函数委托:
Func <int,double, string…. >
必须有返回值,参数类型最多有16个
e.g.:
Static int test(string str){
Console.WriteLine(str);
Return 1;
}
Func<string, int> a=test;//Func <>后面可以有很多类型, 最后一个是返回值类型,其余是参数类型
Console.ReadKey();
多播委托:
一个委托引用多个方法
e.g.:
Static void test1(){
Console.WriteLine(“test1”);
}
Static void test2(){
Console.WriteLine(“test2”);
}
Action a = test1;
a +=test2;//表示添加一个委托的引用
//a -=test1; //删除test1的引用
多播委托的遍历
匿名方法:
Static int test (int arg1, int arg 2){
Return arg1+arg2;
}
Func <int, int, int> a= test;
和下面的匿名方法是等价的;
Func <int,int,int> a=delegate (int arg1, int arg2){
Return arg1+arg2;
}
lambda表达式:
lambda表达式用来代替匿名方法,所以一个lambda表达式也是定义了一个方法
Func<int, int, int> plus =(arg1, arg2) =>//lambda 表达式不需要声明参数类型
{
Return arg1+arg2;
}
观察者模式:
假设猫是被观察者,老鼠是观察者
class Cat{
private string color;
private string name;
public void Cat(string color, string name){
this.name=name;
this.color=color;
}
public void CatComing(){
Console.WriteLine("cat"+name+"is coming");
if(catCome!=null)
catCome();
}
public Action catCome;
}
class Mouse{
private string name;
private string color;
public void Mouse(string color, string name){
this.name=name;
this.color=color;
}
public void RunAway(){
Console.WriteLine("mouse"+name+"runs away");
}
}
namespace{
class Program{
static void Main(string[] args){
Cat cat=new Cat("Blue","Tom");
Mouse mouse1 =new Mouse("Yellow","Jerry");
cat.catCome+=mouse1.RunAway;//注册
Mouse mouse2 =new Mouse("Black","Micky");
cat.catCome+=mouse2.RunAway;//注册
cat.CatComing();
Console.ReadKey();
}
}
}
事件: