委托 C#

  这些就是自己的理解.

  委托的用处就是把方法传递给其他方法.

1委托的使用更类差不多,也 是需要先定义再实例化.

2Action<T>和Func<T>委托

3多播委托

4.匿名方法

5Lambda表达式

6访问外部变量

 

1委托的使用更类差不多,也 是需要先定义再实例化.

public class A
{
public string Aaa(string str)
{
return str;
}
}

public partial class MainWindow : Window
{
private delegate string lianxidelegate(string str);--定义一个带一个参数的返回一个string类型的委托
public MainWindow()
{
lianxidelegate l = new lianxidelegate(new A().Aaa);--实例化此委托
MessageBox.Show(l("aaa"));--调用
InitializeComponent();
}
}

2Action<T>和Func<T>委托

Action<T>表示引用一个void返回类型的方法,最多可以传递16种不同的参数类型

Func<T> 表示引用能带返回类型值的方法

public MainWindow()
{
Func<string,string> op=new A().Aaa;
MessageBox.Show(op("a"));
InitializeComponent();
}

3多播委托

一个委托包含多个方法,这样的委托就是多播委托

就比如刚才A类里面还有个方法Aaaa

public MainWindow()
{
Func<string,string> op=new A().Aaa;
op += new A().Aaaa;
MessageBox.Show(op("a"));
InitializeComponent();
}

多播委托可以识别+和+=,-和-=是删除方法调用.

需要注意的是他调用两个方法,两个方法都返回值,最后的返回值是最后一个方法的.如果一个方法异常了,那下面的方法就不会执行了.这时候你就需要循环了.

public class A
{
public string Aaa(string str)
{
return str;
}
public string Aaaa(string str)
{
return "dfsd";
}
public void No(string str)
{
MessageBox.Show(str);
}
public void No2(string str)
{
MessageBox.Show(str);
}
}

 

public MainWindow()
{
Action<string> daaa=new A().No;
daaa += new A().No2;
Delegate[] deletates = daaa.GetInvocationList();
foreach (var @delegate in deletates)
{
daaa("aaa");
}
InitializeComponent();
}

4.匿名方法

public MainWindow()
{
Func<string, string> aaaaaa = delegate(string str)   //就是这块直接写,不用定义
{
return str;
};
MessageBox.Show(aaaaaa("aaaaaaa"));
InitializeComponent();
}

不过匿名方法,编译器会自己定义一个方法,其实和不匿名是一样的,只是代码好看了,效率并没有提高.匿名方法用的时候不能使用跳转语句,不能跳出去,也不能跳进来.

5Lambda表达式

比匿名方法更好的一种方法就是用Lambda(只是个人喜好)

public MainWindow()
{
Func<string, string> aaaaaa = canshu =>
{
return canshu;
};
MessageBox.Show(aaaaaa("aaaaaaa"));
InitializeComponent();
}

多个参数就这么干就行

Func<string,string,string> aaaaaa = (canshu1,canshu2)=>
{
return canshu1 + canshu2;
};
MessageBox.Show(aaaaaa("aaaaaaa","bbbbbbb"));

6访问外部变量

string cc = "cccc";
Func<string,string,string> aaaaaa = (canshu1,canshu2)=>
{
return canshu1 + canshu2+cc;
};
MessageBox.Show(aaaaaa("aaaaaaa","bbbbbbb"));

当然匿名方法也可以访问

你可能感兴趣的:(C#)