像我在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();
}
}
所以在我的例子中,我理解我的委托是对任何与其签名匹配的函数的引用,如果我传入GoodMorning,我会看到:
Hello and good morning!
如果我传入GoodNight,我会看到:Hello and good night!
所以有点像经历一个中间人...
我不明白是什么意思,为什么我不能直接调用我的GoodMorning / GoodNight方法,当我需要使用它们时?
也许有更好的例子说明代表何时有用,但在这个例子中,为什么我不绕过中间人?
答案 0 :(得分:2)
因为你具体地询问这个例子而不是一般性的:在这段特定的代码中没有必要这样做。它告诉你代表的机制,但它没有告诉你使用它们的意义。
简而言之,关键是某些代码可以在不知道实际接收的方法的情况下引用方法。它可以随后随意调用该代表。这样可以实现比其他方式更多的抽象。
答案 1 :(得分:0)
考虑您有以下代表:
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);
}
}
当然上面是一个粗略的例子,你可以使用代理的事情和不同的情况有很多,特别是如果你想将它们用于事件,你应该考虑使用{{1}来实现它们}关键字。 - https://msdn.microsoft.com/en-us/library/awbftdfh.aspx
总而言之,当行为可能因某些事物的整体实现而有所不同时,您希望使用委托。就像你可能想要在一种情况下做一件事而在另一种情况下做其他事情,但是他们都应该做同样的事情。
如果您不需要基于实现的不同行为,则无需使用委托。如果可能的话,你总是想直接调用一个方法。
我希望这解释得很好。