2012-12-28 31 views
3

有人可以舉例說明如何使用匿名方法嗎?使用匿名方法的示例和縮回

它們是否會退化使用它們的性能?

+0

參見[什麼 - 是匿名的方法,在-C(http://stackoverflow.com/questions/6008097/what-are- anonymous-methods-in-c)有例子。 – nawfal

回答

3

我覺得非常有用使用匿名方法來避免全局變量

如果沒有匿名方法:

private static Dictionary<Binding, ErrorProvider> dict = 
    new Dictionary<Binding, ErrorProvider>(); 

public static void ParseBinding(Binding binding) 
{ 

    var errorProvider = new ErrorProvider(); 

    dict.Add(binding, errorProvider); 

    binding.Parse += new ConvertEventHandler(binding_Parse); 

} 

static void binding_Parse(object sender, ConvertEventArgs e) 
{ 
    var binding = sender as Binding; 
    var errorProvider = dict[binding]; 

    try 
    { 
      // some validation form e.Value 
      // throws exception if not valid 
    } 
    catch (Exception ex) 
    { 
     errorProvider.SetError(binding.Control, ex.Message); 
    } 
} 

這是非常危險的,因爲我需要照顧我自己從刪除的條目字典,如果不再使用,否則我有內存泄漏,因爲垃圾回收器永遠不會處理綁定或錯誤提供程序。

現在簡單多了實現匿名方法:

public static void ParseBinding(Binding binding) 
{ 
    var errorProvider = new ErrorProvider(); 

    binding.Parse += (sender, e) => 
     { 
      try 
      { 
       // some validation form e.Value 
       // throws exception if not valid 
      } 
      catch (Exception ex) 
      { 
       errorProvider.SetError(binding.Control, ex.Message); 
      } 
     }; 
} 
2

閱讀MSDN:Anonymous Methods (C# Programming Guide)

創建匿名方法基本上是傳遞一個代碼塊 作爲委託參數的方式。

通過使用匿名方法,您可以通過消除創建單獨的 方法來減少實例化代表的編碼開銷。

例如,在一個委託的地方指定碼塊不必創建方法似乎一個 不必要的開銷


它是一種當可 有用的情況在目標位於 塊之外的匿名方法塊內,有跳轉語句錯誤(如goto,break或 )。跳轉語句(例如goto, break或continue)在塊內部的目標爲 的匿名方法塊之外也是錯誤的。

匿名方法無法訪問外部作用域的ref或out參數。

在匿名方法塊內不能訪問不安全的代碼。

而且讀Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes

匿名方法被定義在線,而不是作爲 任何類的成員方法。此外,無法將方法屬性應用於匿名方法,也不能將匿名方法定義爲通用類型 或添加通用約束。

1

可能會有所幫助......

http://www.dotnet-tricks.com/Tutorial/csharp/40ID180612-C-Sharp-Anonymous-Method.html

有幾個缺點,雖然使用匿名方法。首先,您不能使用Visual Studio調試器中的「編輯並繼續」功能。在單步執行代碼時不允許對方法或匿名方法進行更改 - 相反,您必須更改代碼並重新啓動調試器。

另一個潛在的問題是,假設匿名方法中的代碼需要執行以響應多個事件,一些開發人員可能會發現自己在其應用程序的多個位置複製並粘貼代碼,因此忽略了一般規則的代碼重用。