委托示例有什么意义

本文关键字:什么 | 更新日期: 2023-09-27 18:36:25

就像我在SO上找到的许多其他帖子一样,我试图了解代表们。希望这个例子没有被归类为重复,因为我正在问一个关于特定例子的特定问题。

 public delegate void HelloFunctionDelegate(string message);
    public class Delegate
    {
        static void Main()
        {
            HelloFunctionDelegate del = new HelloFunctionDelegate(GoodNight); // delegate will point to the GoodNight method
            del("Hello"); // invoke the delegate
        }
        public static void GoodMorning(string strMessage)
        {
            Console.WriteLine(strMessage + " and good morning!");
            Console.ReadKey();
        }
        public static void GoodNight(string strMessage)
        {
            Console.WriteLine(strMessage + " and good night!");
            Console.ReadKey();
        }
    }

因此,在我的示例中,我知道我的委托是对与其签名匹配的任何函数的引用,如果我传入早安,我会看到: Hello and good morning!

如果我在晚安中经过,我会看到:Hello and good night!

所以这有点像通过一个中间人...

我不明白有什么意义,为什么我不直接调用我的早安/晚安方法,当我需要使用它们时?

也许有更好的例子来说明委托何时有用,但在这个例子中,我为什么不绕过中间人呢?

委托示例有什么意义

由于您具体询问的是此示例而不是一般问题:因此在此特定代码段中这样做是没有意义的。它教你代表的机制,但它没有教你使用它们的意义。

简而言之,关键是某些代码段可以引用一个方法,而不知道它实际会接收什么方法。它稍后可以随意调用该委托。这比其他方式可以实现更多的抽象。

假设您有以下委托:

public delegate void CarEvent(Car car);

然后你有一个如下所示的实现:

public class Car : DataRecord
{
    // An event to execute when the record is deleted
    public CarEvent OnDelete { get; set; }
    public void Delete()
    {
        this.DeleteRecord(); // Deletes this record from ex. the database
        if (OnDelete)
        {
            OnDelete(this); // Executes the event
        }
    }
}

通过使用委托,您可以为OnDelete订阅不同的方法,从而允许您在删除记录时执行不同的操作。

例如,您可以这样做,以便在删除记录时将其从保存它的"ListView"中删除。

public class CarList : ListView
{
    public CarList()
        : base()
    {
        foreach (var car in CarRecords.LoadCars())
        {
            var listViewItem = new ListViewItem(car);
            car.OnDelete = this.DeleteCarFromList;
            this.Items.Add(listViewItem);
        }
    }
    private void DeleteCarFromList(Car deletedCar)
    {
        this.Items.Remove(deletedCar);
    }
}

当然,以上是一个粗略的例子,还有很多事情和不同类型的情况,你可以使用委托,最值得注意的是,如果你想将它们用于事件,你应该考虑使用 event 关键字实现它们。 - https://msdn.microsoft.com/en-us/library/awbftdfh.aspx

总而言之,当行为可能因某些内容的整体实现而异时,您希望使用委托。就像你可能想在一种情况下做一件事,在另一种情况下做另一件事,但他们都应该做同样的事情。

如果不需要基于实现的不同行为,则无需使用委托。如果可能,您始终希望直接调用方法。

我希望这解释得很好。