繁体   English   中英

我应该如何以及为什么应该使用事件和委托

[英]How and why should I use Events and delegates

我阅读了有关事件和代表的信息。 我想我了解它们的工作原理,但我不明白为什么要使用它们。

例如,我有一个网上商店,客户有余额并用这笔钱购买产品。

这足以完成这项工作。 当用户买东西、卖东西或存钱时 - UserWallet 类被调用。

class Shop
{
    public static void BuyOrderFilled(){
        if(userHasBalance()){
            UserWallet userWallet = new UserWallet();
            userWallet.DeductMoney();
        }

        UpdateInventory();
    }

    public static void SellOrderFilled(){
        //Sell order has different logic
        if(userHasProduct()){
            UserWallet userWallet = new UserWallet();
            userWallet.RemoveProductFromUser();
        }

        UpdateInventory();
    }
}

class Deposit{
    public static void UserGotDeposit(decimal amount){
        UserWallet userWallet = new UserWallet();
        userWallet.FillUserBalance(amount);
    }
}

class UserWallet{
    public void DeductMoney(){
        //Some logic
    }
    public void RemoveProductFromUser(){
        //Some logic
    }
    public void FillUserBalance(){
        //Some logic
    }
}
public class Main(){
    Shop.BuyOrderFilled();
    Shop.SellOrderFilled();
    Deposit.UserGotDeposit(100);
}

当我可以在需要时调用 UserWallet 方法时,为什么要使用事件或委托?

你不必使用它们..

..只是有时能够像传递数据一样传递方法非常方便。

通常情况下,如果您提供一个库供其他人使用,并且您想让它对他们有用,但您对他们的代码或他们将如何使用它一无所知,那么这种实用程序通常是有用的。 一个明显的就是框架中的List<T> 您可能正在编写类似的内容,并希望为人们提供一种搜索 if 的方法,但您不知道他们将在列表中放入什么样的对象或他们想要如何搜索它们。

但是,如果您只是为他们提供像Find(delegate)这样的方法,那么它就是“将方法作为参数的方法”-您向用户声明“为 Find 提供一个方法,该方法采用 T 并返回布尔值 true如果它应该包含在搜索结果中”,那么这意味着他们可以编写这样的方法:

bool IsSmith(Person p) {
  return p.LastName == "Smith";
}

他们可以将它传递给你的列表 Find 方法,你的方法运行他们的方法,给它 List 对象,获取一个 bool 并根据结果决定做什么

var smiths = myListOfPeople.Find(IsSmith);

现在我们通常不会这么长时间地编写方法,我们使用时髦的内联声明,我们只提供参数名称和逻辑,编译器插入它可以解决的所有其他内容

var smiths = myListOfPeople.Find(p => p.LastName == "Smith");

本质上,您可以在编写 List 类时控制流程的每个部分,您可以实现查找,您可以返回结果 - 但是在使您的 List 真正灵活并让人们在其中存储他们想要的内容时,您创建了一个差距在中间,您不知道如何搜索用户放入的任何内容。 能够让他们在(已知参数类型和返回类型)中传递一个你可以调用的方法来弥补这个差距


另一个例子; 这次的事件,但它们没有什么不同。 事件只是一个方法列表,您的类的用户可以用“发生某些事情时应运行的代码位”填充这些方法

单击按钮:您想下载文件,您的同事想保存图像,我想计算在文本框中输入的数字的因数.. 我们都在使用相同的 Button 类,但我们都想做当我们点击不同的按钮时会有不同的事情,所以微软制作完美按钮的最简单方法是留下“点击时执行此操作”部分让我们填写,这是通过一种关联委托的方式来完成的(方法像变量一样传递)与按钮,并对按钮进行编码,以便在单击时运行委托,无论委托可能做什么


所以这一切对微软来说都很棒,他们创建了按钮和列表以及其他通用的东西供我们享受,但它是否在我们自己的代码中占有一席之地? 当然,虽然更罕见,但我发现制作一些帮助类会很有帮助,例如 - 启动 ffmpeg 并从其输出流中读取的东西。当发送这样的消息时引发..我在一个项目中使用我的助手,我正在寻找丢失的帧,在另一个我想知道是否检测到静音..在这些情况下,我想“提供库的人消费图书馆的人”在两端都是我。 我有其他项目,我想对不同的数据执行类似的任务,编写器例程相同但解析不同; 能够传递一个方法来说明如何从这个对象中提取一个名称,但是从那个对象中提取一个数字比拥有一些巨大的“如果对象是一个人提取名称,否则如果对象是一个建筑物拉动”要好得多号码和街道”条件块在它不属于的地方

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM