参考:https://www.cnblogs.com/LGDD/p/9551232.html
1.什么是委托
2委托有什么优势
3怎么用委托
定义:委托是一种数据类型,和类是同级别的,delegate可以直接看着关键字class,我们可以直接将delegate看着为class,区别为class里存放的是一系列方法,属性,字段,事件,索引。而delegate里存放的是一系列具有相同类型参数和返回回类型的方法的地址的地址。可以看着为储存方法的载体。
2. 委托的声明:delegate <函数返回类型> 委托名(函数参数) 例:public delegate void myDelegate(string name);
3.委托的实例化:
(1) <委托名> 实例化名 = new <委托名>(注册函数) 注意:注册函数不包含参数,或者可以直接将一个注册函数赋值给委托 例 myDelegate delegateinstance = new myDelegate(method);
(2)匿名方法实例化委托
<委托类型> <实例化名>=delegate(<函数参数>){函数体};
(3)使用lamda表达式实例化委托
委托的使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace FacedeModel
{
/// <summary>
///委托 第一种方法当参数(方法要静态,否则会报错)
/// </summary>
class Program
{
//-------------------
public delegate void Mydelegate();
public static void Hello()
{
Console.WriteLine("大家好");
}
public static void Name()
{
Console.WriteLine("我叫委托");
}
static void Main(string[] args)
{
Mydelegate mydelegate = new Mydelegate(Hello);
mydelegate += Name;
mydelegate();
Test(mydelegate);
}
public static void Test(Mydelegate mydelegate)
{
mydelegate();
}
//-------------------------委托的一种用法方法当参数使用
}
}
using System;
using System.Threading;
using System.Windows.Forms;
namespace ThreadForm
{
public partial class Form1 : Form
{
//第二种跨线程的时候时候使用
public Form1()
{
InitializeComponent();
}
private void Add()
{
Thread thread = new Thread(new ThreadStart(Test));
thread.Start();
}
private void Test()
{
//--------------若直接赋值,则属于跨线程赋值,报错
//textBox1.Text = "200";
//---------------跨线程赋值用this.invoke,下面是使用的两种形式
//if (this.InvokeRequired)
//{
// this.Invoke((Action)(() =>
// {
// textBox1.Text = "200";
// }));
//}
//---------------------------
//if (this.InvokeRequired)
//{
// this.Invoke((EventHandler)delegate
// {
// textBox1.Text = "1000";
// });
//}
}
private void Button1_Click(object sender, EventArgs e)
{
Add();
}
}
}
8.委托的用处
1.高内聚低耦合
2.观察者模式