看到項(xiàng)目有使用委托泊窘,一直都搞不明白是怎么回事熄驼,看了好幾遍才略懂一二,關(guān)于c#接觸時(shí)間時(shí)間短烘豹,目前工作有用到c#進(jìn)行開(kāi)發(fā)瓜贾,實(shí)際工作中寫(xiě)的更多的是業(yè)務(wù)代碼,一些技巧性的東西携悯,還是得下去找時(shí)間研究一下阐虚,不然還是一知半解,不知所云……
簡(jiǎn)介
委托類(lèi)似與C/C++中的指針蚌卤,它是一種引用類(lèi)型实束,表示對(duì)具有特定參數(shù)列表和返回類(lèi)型的方法的引用。 在實(shí)例化委托時(shí)逊彭,你可以將其實(shí)例與任何具有兼容簽名和返回類(lèi)型的方法相關(guān)聯(lián)咸灿。 你可以通過(guò)委托實(shí)例調(diào)用方法。使用delegate進(jìn)行聲明侮叮。
例子
//聲明一個(gè)委托避矢,有一個(gè)參數(shù),且無(wú)返回值的函數(shù)囊榜,都可以使用委托來(lái)調(diào)用
public delegate void DelegateHandel(string message);
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
//實(shí)例化委托
DelegateHandel delhandel=DelegateMethod;
//調(diào)用委托
delhandel("hello world");
多播委托
你可以使用+來(lái)將多個(gè)對(duì)象關(guān)聯(lián)到一個(gè)委托實(shí)例上审胸,使用-將其取消關(guān)聯(lián)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace testdelegate
{
delegate void delhandel(string s);
class Program
{
static void hello(string s)
{
System.Console.WriteLine("hello{0}",s);
}
static void world(string s)
{
System.Console.WriteLine("world{0}",s);
}
static void Main(string[] args)
{
delhandel del1, del2, del3,del4;
del1 = hello;
del2 = world;
del3 = hello;
del3 += world;
del4 = del3 - del2;
del1("A");
del2("B");
del3("C");
del4("D");
System.Console.ReadLine();
}
}
}
2018-03-24_010258.png
利用委托進(jìn)行窗口傳消息
先創(chuàng)建一個(gè)主窗口和一個(gè)子窗口卸勺,在主窗口中添加一個(gè)按鈕用來(lái)顯示出子窗口砂沛,在子窗口中添加一個(gè)按鈕用來(lái)傳遞消息給主窗口。子窗口的按鈕這里我們用它來(lái)改變主窗口的背景顏色曙求,你可以傳遞文字消息碍庵。
//childwindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace testdel
{
/// <summary>
/// childwindow.xaml 的交互邏輯
/// </summary>
public partial class childwindow : Window
{
//定義一個(gè)委托
public delegate void ChangeHandel();
//定義委托的事件
public event ChangeHandel ChangeEvent;
public childwindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
//判斷這個(gè)事件是否有注冊(cè)
if (ChangeEvent != null)
{
ChangeEvent();
}
}
}
}
//mainwindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace testdel
{
/// <summary>
/// MainWindow.xaml 的交互邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
childwindow childwin = new childwindow();
//顯示子窗口時(shí)添加事件訂閱
childwin.ChangeEvent += new childwindow.ChangeHandel(changecolor);
childwin.Show();
}
private void changecolor()
{
backgrid.Background = new SolidColorBrush(Colors.Red);
}
}
}
2018-03-24_013807.png