參考: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.觀察者模式