簡體   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