委托示例有什么意义
本文关键字:什么 | 更新日期: 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
总而言之,当行为可能因某些内容的整体实现而异时,您希望使用委托。就像你可能想在一种情况下做一件事,在另一种情况下做另一件事,但他们都应该做同样的事情。
如果不需要基于实现的不同行为,则无需使用委托。如果可能,您始终希望直接调用方法。
我希望这解释得很好。