C# 代表示例what';重点是什么

C# 代表示例what';重点是什么,c#,C#,像我在SO上找到的许多其他帖子一样,我正试图让我的头脑围绕着代表们。希望这个例子不会被归类为重复,因为我在问一个关于某个例子的特定问题 public delegate void HelloFunctionDelegate(string message); public class Delegate { static void Main() { HelloFunctionDelegate del = new HelloFu

像我在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();
        }
    }
因此,在我的示例中,我知道我的委托是对与其签名匹配的任何函数的引用,如果我在Goodwahon中传递,我将看到:
你好,早上好

如果我路过《晚安》,我会看到:
你好,晚安

所以这有点像经历一个中间人

我不明白这是什么意思,为什么我不在需要的时候直接调用我的早安/晚安方法呢


也许有更好的例子可以说明委托是否有用,但在这个例子中,为什么我不绕过中间人?

因为您是在具体询问这个例子,而不是一般性地询问:在这段特定的代码中这样做没有意义。它会教你代理的机制,但不会教你使用它们的意义


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

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


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

假设您有以下委托:

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);
    }
}

当然,以上是一个粗略的例子,有很多事情和不同的情况,你可以使用委托,最重要的是,如果你想用它们来处理事件,你应该考虑使用<代码>事件< /代码>关键字来实现它们。- 总而言之,当行为可能因某事物的总体实现而有所不同时,您希望使用委托。就像你可能想在一种情况下做一件事,在另一种情况下做另一件事,但他们都应该做同样的事情

如果您不需要基于实现的不同行为,那么就不需要使用委托。如果可能的话,您总是希望直接调用一个方法


我希望这可以解释清楚

假设您有以下代表:

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);
    }
}

当然,以上是一个粗略的例子,有很多事情和不同的情况,你可以使用委托,最重要的是,如果你想用它们来处理事件,你应该考虑使用<代码>事件< /代码>关键字来实现它们。- 总而言之,当行为可能因某事物的总体实现而有所不同时,您希望使用委托。就像你可能想在一种情况下做一件事,在另一种情况下做另一件事,但他们都应该做同样的事情

如果您不需要基于实现的不同行为,那么就不需要使用委托。如果可能的话,您总是希望直接调用一个方法


我希望这可以解释清楚

你可以推迟执行。或者以
.ForEach()
扩展方法为例,它接受将对列表中的项执行的委托。因此,这些委托的执行被延迟。尝试搜索,存在大量重复。阅读我的问题,你会注意到我已经提到了一个事实,我已经阅读了许多其他帖子,我想知道这个特定示例的原因。在这个示例中,你不会使用委托,当您不知道所需的行为是什么时,您可以使用它们,并将其作为参数提供给您。您恰好发现,2015年发布在2009年的一个问题上,而中的所有其他答案(所有答案都至少有一个投票权)都很好地解释了何时以及为什么使用代理。因此,您的问题“他们为什么这样使用代理”的答案是“因为他们试图展示一个示例,但在这方面做得不太好”。如果我们就每一个不太完美的答案发布一个问题,我们会有一个无限循环。你可以延迟执行。或者以
.ForEach()
扩展方法为例,它接受将对列表中的项执行的委托。因此,这些委托的执行被延迟。尝试搜索,存在大量重复。阅读我的问题,你会注意到我已经提到了一个事实,我已经阅读了许多其他帖子,我想知道这个特定示例的原因。在这个示例中,你不会使用委托,当您不知道所需的行为是什么时,您可以使用它们,并将其作为参数提供给您。您恰好发现,2015年发布在2009年的一个问题上,而中的所有其他答案(所有答案都至少有一个投票权)都很好地解释了何时以及为什么使用代理。因此,您的问题“他们为什么这样使用代理”的答案是“因为他们试图展示一个示例,但在这方面做得不太好”。如果我们发布一个关于电动汽车的问题