簡體   English   中英

為什么要包含Func / Func <T> 作為參數?

[英]Why would I include a Func/Func<T> as a parameter?

我承認它們會很有用,但是當我實際上想將func作為方法的參數時,我正在想盡辦法。

public void WeirdMethod(int myNumber, func op);

在設計和功能方面,有人可以向我解釋一些我想考慮的情況嗎? “可重用性”的理論不會對我有多大幫助。 現實世界中的場景將是最好的。 幫我想你一樣。

這是我所知道的一切:

  • 這將使我可以通過代表
  • 這將允許我使用lambda表達式。

對...

注意:我知道此線程將關閉,因為沒有“正確”的答案。 但是我認為,對我而言,單擊它的只是“延遲計算”。

  • 將操作推遲到以后。 一個非常實際的示例是將更改跟蹤推遲到完全填充對象樹之前。 每種類型或存儲庫都可以告訴您它想要做什么,而調用者可以決定何時實際執行此操作。

  • 邏輯的組成(如賈斯汀·尼斯納(Justin Niessner)所述)。

  • 抽象,例如(“這是一個具有輸入和輸出的合同,但是我不關心只要實現合同就可以實現它。)例如,您可以將“ statusWriter” Func傳遞給可以編寫的方法到控制台,調試窗口,日志文件,數據庫或什么都不做,所有使用方法都知道它會使用一個類型並在需要時調用它。

  • 同樣,將Func傳遞給方法允許抽象和簡單的方式允許調用者定義where謂詞。 我經常使用這種范例來支持將強類型的過濾器應用於結果(不是在談論LINQ to SQL,只是在調用者認為合適的情況下過濾信息列表)。

  • 優雅的功能范例,例如該示例演示使用匿名函數進行遞歸。 如果沒有將一個功能傳遞給另一功能的能力(尤其是縮寫形式),這些構造將是冗長/不可能的。

一般情況是您必須將延遲的計算傳遞給方法。 當計算某些東西很昂貴時,例如,當您緩存某些東西時,這很有用。

public Guid GetFromCache(string key, Func<Guid> make) {
    Guid res;
    if (!cache.TryGetValue(key, out res)) {
        res = make();
        cache.Add(key, res);
    }
    return res;
}

現在,您可以按以下方式調用此方法:

Guid guid = GetFromCache(myKey, () => database.MakeNewGuid());

如果您有異步的東西,並且想給它一個回調方法?

它們使您能夠使用Curry功能以及使用功能組合。

盡管您幾乎肯定曾經使用過委托(因為這就是事件),但是LINQ是將委托作為函數參數傳遞時的主要示例。

想想Where 您正在為使用它作為執行的一部分的函數提供邏輯(特別是滿足條件的定義-無論它們是什么)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM