C#-委托

74 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 天,点击查看活动详情