开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
简介
委托类似与C/C++中的指针,它是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用,我们使用关键字delegate
来声明一个委托类型,在项目开发中委托使用还是比较常见的。在c#中,委托可以将方法作为参数传递给另一个方法。
使用
//声明一个委托,有一个参数,且无返回值的函数,都可以使用委托来调用
public delegate void DelegateHandel(string message);
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
//实例化委托
DelegateHandel delhandel=DelegateMethod;
//调用委托
delhandel("hello world");
多播委托
委托可以调用多个方法,你可以使用+
来将多个对象关联到一个委托实例上,使用-
将其取消关联。
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();
}
}
}
匿名方法
可以使用匿名方法创建委托,这样可以在不创建新的命名方法的情况下传递代码块。
public delegate void MyDelegate(int value);
public void Main()
{
MyDelegate myDelegate = delegate(int value)
{
Console.WriteLine($"The value is {value}");
};
myDelegate(42);
}
Lambda 表达式
可以使用Lambda表达式创建委托,这样看起来代码更加简洁。
public delegate void MyDelegate(int value);
public void Main() {
MyDelegate myDelegate = (value) => Console.WriteLine($"The value is {value}");
myDelegate(42);
}
委托和事件
委托和事件通常一起使用,事件是一种特殊的委托,它允许我们在类中定义事件并在该类中触发该事件。事件允许类与其它对象通信,而无需知道这些对象的具体实现细节。事件通常用于实现观察者模式,它允许多个对象注册为事件的观察者,并在事件发生时接收通知。
public delegate void EventHandler(object sender, EventArgs e);
public class MyEventSource {
public event EventHandler MyEvent;
protected virtual void OnMyEvent()
{
if (MyEvent != null)
{
MyEvent(this, EventArgs.Empty);
}
}
}
public class MyEventListener
{
public void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("My event was handled.");
}
}
public void Main()
{
MyEventSource source = new MyEventSource();
MyEventListener listener = new MyEventListener();
source.MyEvent += listener.HandleMyEvent;
source.OnMyEvent();
}
利用委托进行窗口传消息
先创建一个主窗口和一个子窗口,在主窗口中添加一个按钮用来显示出子窗口,在子窗口中添加一个按钮用来传递消息给主窗口。子窗口的按钮这里我们用它来改变主窗口的背景颜色,你可以传递文字消息。
//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
{
//定义一个委托
public delegate void ChangeHandel();
//定义委托的事件
public event ChangeHandel ChangeEvent;
public childwindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
//判断这个事件是否有注册
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();
//显示子窗口时添加事件订阅
childwin.ChangeEvent += new childwindow.ChangeHandel(changecolor);
childwin.Show();
}
private void changecolor()
{
backgrid.Background = new SolidColorBrush(Colors.Red);
}
}
}
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情