c# - 无法理解委托(delegate)在真实场景中的使用

标签 c# delegates

<分区>

我无法理解在 .NET 世界中如何正确使用委托(delegate)。 Delegates有什么不能解决的?我想知道什么场景/情况是理想的或候选的委托(delegate)使用。

我知道 LINQ 和 Lambda 表达式都在幕后使用委托(delegate)。我知道如何创建和使用它,但我不明白的是为什么我应该创建和使用它们?

任何现实世界的例子或经验分享将不胜感激。

更新:

我创建了以下类

using System;
using System.Collections.Generic;
using System.Linq;

namespace Basics
{
public class Program
{
    static void Main()
    {
        Flight.FlightTakeOffDelegate flightDelegate;

        var flights = new List<Flight>
            {
                new Flight {Number = "FL001", DepartureTime = DateTime.Now, TotalCrew = 15},
                new Flight {Number = "FL002", DepartureTime = DateTime.Now.AddHours(1), TotalCrew = 15},
                new Flight {Number = "FL003", DepartureTime = DateTime.Now.AddHours(2), TotalCrew = 15},                    
            };

        var tower = new FlightTower(flights);

        // Flight 002 asking to Take off
        var flightAskingToTakeOff = flights.FirstOrDefault(x => x.Number == "FL002");
        if (flightAskingToTakeOff != null)
        {
            Console.WriteLine(string.Format("Flight {0} \t: Okay to take off?", flightAskingToTakeOff.Number));
            flightDelegate = tower.CanTakeOff;
            flightAskingToTakeOff.CanTakeOff = flightDelegate.Invoke(flightAskingToTakeOff);
            Console.WriteLine(string.Format("Flight Tower \t: {0}", flightAskingToTakeOff.CanTakeOff));
        }

        // Flight 001 asking to Take off
        flightAskingToTakeOff = flights.FirstOrDefault(x => x.Number == "FL001");
        if (flightAskingToTakeOff != null)
        {
            Console.WriteLine(string.Format("Flight {0} \t: Okay to take off?", flightAskingToTakeOff.Number));
            flightDelegate = tower.CanTakeOff;
            flightAskingToTakeOff.CanTakeOff = flightDelegate.Invoke(flightAskingToTakeOff);
            Console.WriteLine(string.Format("Flight Tower \t: {0}", flightAskingToTakeOff.CanTakeOff));
        }

        Console.ReadKey();
    }
}

public class FlightTower
{
    private readonly List<Flight> _schedule;

    public FlightTower(List<Flight> schedule)
    {
        _schedule = schedule;
    }


    public bool CanTakeOff(Flight flight)
    {            
        var arrivingFlights = _schedule.Where(x => x.ArrivalTime == DateTime.Now);

        if (!arrivingFlights.Any())
        {

            var flightInQueue = _schedule.FirstOrDefault(x => x.DepartureTime == _schedule.Min(c=> c.DepartureTime));
            if (flightInQueue != null && flightInQueue.Number == flight.Number)
            {                    
                return true;
            }
        }

        return false;
    }
}


public class Flight
{
    public delegate bool FlightTakeOffDelegate(Flight flight);

    public string Number { get; set; }
    public DateTime DepartureTime { get; set; }
    public DateTime ArrivalTime { get; set; }
    public int TotalCrew { get; set; }
    public bool CanTakeOff { get; set; }
}

谁能看看在这种情况下如何使用委托(delegate)?

最佳答案

我有一个人为但很明显的例子给你。

假设您有一组消息。

public class Message  
{
    public string Tag {get;set;}
    public byte[] RawData{ get;set;}
}

您从队列中获取它们。

您想解析它们。

public class Parser 
{
    private Dictionary<string, Func<Message, string>> _handlers = 
                               new Dictionary<string, Func<Message, string>>
    {
        {"Tag1", (message) => {here are parse rules}},
        {"Tag2", (message) => {here are parse rules2}},
    }

    public string Handle(Message message)
    {
        var handler = _handlers[message.Tag];
        return handler(message);
    }
}

因此,如您所见,您可以将任何委托(delegate)视为普通对象。您可以存储一个集合,您可以将它们传递给其他方法等等。

关于c# - 无法理解委托(delegate)在真实场景中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19405571/

相关文章:

iphone - 单击 MKAnnotationView 中的按钮

c# - 如何删除linq查询中的重复项

c# - “设置”由于其保护级别而无法访问

c# - 如何使用 GetType 获取类的类型

C# 使用文本框作为 streamwriter 的文件名

c# - 用反射拦截方法

javascript - 在 QML 中委托(delegate)一个数组

ios - 当调用 textFieldDidEndEditing 时,应用程序卡住

c# - 如何将此 T-SQL 语句转换为 linq

c# - 如何定义事件然后在事件发生时启动委托(delegate)