2012-07-07 58 views
19

如果我搜索了,我一定會舉例說明什麼是代表和行動。 我已經閱讀了給出代表例子的基本書籍。C#代表與行動之間的區別是什麼?

但我想知道的是他們在現實世界中的使用。請不要給你好世界的例子或動物類他們太基本

例如, :

  1. 是它們之間有什麼區別
  2. 當使用委託或動作
  3. 當不使用委託或動作
  4. 當他們可以過殺
+3

的動作爲代表的簽名沒有參數並具有沒有回報價值。 – Siege 2012-07-07 16:19:18

+0

我可以在這些拖車上搜索並閱讀MSDN。但是我正在尋找的是代表&簡單的真實世界範例&Action – HatSoft 2012-07-07 16:23:11

+1

因爲'Action'是一個特定的委託類型,所以不能同時使用'Action'而不使用委託。 – CodesInChaos 2012-07-07 16:29:08

回答

22

Action一個Delegate。它的定義如下:

public delegate void Action(); 

您可以創建自己的委託類型,類似於創建抽象方法的方式;你寫簽名但沒有實現。然後通過採用方法的參考來創建這些委託的實例。

class Program 
{ 
    public static void FooMethod() 
    { 
     Console.WriteLine("Called foo"); 
    } 

    static void Main() 
    { 
     Action foo = FooMethod; // foo now references FooMethod() 
     foo(); // outputs "Called foo" 
    } 
} 
17

當你定義一個委託時,你基本上定義了一個方法的簽名(返回類型和參數)。

An Action是一個已經定義的代理(void return和no args)。

public delegate void Action() 

你可以去定義,並自己看看。或者在這裏的文檔。 http://msdn.microsoft.com/en-us/library/system.action.aspx

當我正在查找的方法的簽名與支持的簽名匹配時,我幾乎總是使用現有的通用委託(其中的操作是一個)。使用通用代表的一個好處是它們是衆所周知的。大多數開發人員都知道Action是無效的。如果我要定義我自己的Action版本,每個人都需要查看它的簽名,而我只是複製了一些已經存在的東西。

例如...由於void/void方法的目的只能用於變異,所以Action很少見。 Func非常普遍(也是一個通用代理)。有一些在整個框架中使用它的例子,特別是在linq中。看看。例如。 http://msdn.microsoft.com/en-us/library/bb534803.aspx。這是一個Func,它意味着它將你正在處理的集合類型的元素作爲參數並返回一個布爾值。在具有Func的where語句返回true的情況下,意味着將其包含在結果中,反之亦然。

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 
+1

正如我所說我可以搜索和閱讀MSDN,但需要真實世界的例子 – HatSoft 2012-07-07 16:23:59

6

由於肯尼斯&圍攻已經指出的代碼& MSDN我只是嘗試用現實世界的例子讓我們填寫。

考慮一個定義「移動」的代表。

在現實世界中的'行動'代表將是'跑'或'走'。你不關心你移動的速度,你採用什麼路線或報告移動的時間。

一個非行動委託可以例如定義您以什麼速度運行並返回完成它的時間。

public delegate void MoveAction(); 
public delegate int MoveDelegate(int speed); 

擴展圍困的例子..

class Program 
{ 
    public static void Run() 
    { 
     Console.WriteLine("Running"); 
    } 

    public static int RunAtSpeed(int speed) 
    { 
     // logic to run @ speed and return time 
     Console.WriteLine("Running @ {0}", speed); 
     return 10; 
    } 

    public static int WalkAtSpeed(int speed) 
    { 
     // logic to walk @ speed and return time 
     Console.WriteLine("Walking @ {0}", speed); 
     return 20; 
    } 

    static void Main() 
    { 
     Action foo = Run; 
     foo(); 

     MoveDelegate run = RunAtSpeed; 
     int result1 = run(5); 

     MoveDelegate walk = WalkAtSpeed; 
     int result2 = walk(1); 
    } 
} 
3

作用是什麼: 很簡單動作,Func鍵<>,謂語都是類型的委託。

爲什麼我們需要行動: 動作封裝了不同數量的參數和不同類型的返回類型在許多情況下足以滿足應用程序的開發。這些在System名稱空間中提供。您可以自由創建您自己的代表。

請注意,有17種不同類型的Action和Func,每個類型都有0到16個參數化泛型參數。

動作始終沒有返回值。 Func有一個參數化的泛型返回類型。

恕我直言,並不需要謂詞委託被定義爲它真的等同於Func鍵接受一個ARG並返回布爾。

1

「Console.WriteLine」用戶在較早的答案中已經提供了被重複請求的真實世界示例代碼。

就我所瞭解的行爲而言,Action是一種節省定義新代表的方法。由於它是特定簽名類型的預定義委託,因此可以節省爲每個預期用途創建不同委託的麻煩。你只需使用預定義的Action委託來指向你的方法並運行它們。 Func代表也是如此。

更多的是方便,而不是實際的新功能。幫助保持您的代碼簡潔易懂,而且麻煩較少。

至於你的逐點問題,

  1. 什麼是他們

無差異的區別。 Action是一個預定義的代表,旨在爲您節省重複定義新代表的麻煩。

  • 在需要具有表驅動的功能當使用一個委託或動作
  • 通常,委託(和動作)的地方被使用。即可能是對應於一些特定要求的方法的字典。請注意,在這裏使用Action可以很容易地改變調用的最終方法,動態指向其他一些方法(可能基於用戶選擇的某些設置?)


    class Program 
    { 
        static void Main() 
        { 
        Dictionary<string, Action> dict = new Dictionary<string, Action>(); 
        dict["loadFile"] = new Action(LoadFile); 
        dict["saveFile"] = new Action(SaveFile); 
    
        dict["loadFile"].Invoke(); 
        dict["saveFile"].Invoke(); 
        } 
    
        static void SaveFile() 
        { 
        Console.WriteLine("File saved!"); 
        } 
    
        static void LoadFile() 
        { 
        Console.WriteLine("Loading File..."); 
        } 
    } 
    

    另一種典型的使用情況是用於回調方法。例子就是使用BubbleSort類的地方,將比較器方法作爲代理傳遞給類,BubbleSort類可以使用該方法來讓代碼定義比較邏輯,同時處理所有其他事情。這也可以從你已經開始的線程中使用,並且當需要將一些中間操作通知給你的代碼時,線程調用委託。

    你可以參考這個帖子看到上面的一個很好的例子。 https://stackoverflow.com/a/3794229/1336068

  • 當不使用委託或動作
  • 我能想到當時的情況要求它不使用它們的唯一原因,就是如果你的代表將在短時間內被調用數百萬次。涉及的開銷很小,如果這導致應用程序滯後,那麼您可能需要找到一種更好的方法來解決這個問題,而不是通過委託來直接引用您的函數。

  • 當他們可以過殺
  • 當無償使用他們沒有任何真正的需要。否則,在大多數情況下,它們可以成爲解決上述情況的優雅方法。

    而且,閱讀本SO回答,看看普通方法之間的區別,代表們更好地瞭解在哪裏使用委託/動作/ FUNC https://stackoverflow.com/a/17380580/1336068

    +0

    不錯的嘗試。有點囉嗦 – Louis 2017-10-02 17:46:58

    相關問題