[英]What new functionality is available through delegates and events in C# 3?
我覺得我沒有利用 .NET 3.5 及更高版本中可用的代表/事件的所有功能。 並且或多或少仍在使用 2.0 中可用的代表權力。 如果您告訴我現在應該如何使用委托/事件、技巧、捷徑,我將不勝感激。
謝謝。
編輯
喬恩建議他在這個主題上發表文章,我在這里發帖是為了更容易導航:
我的一些可能相關的文章:
我的書 C# in Depth 有一整章專門介紹代表(第 5 章)。 不幸的是,這不是免費的之一:(
附言。 我找不到這個問題的副本,但確實瀏覽了很多關於這個主題的內容。
我的一些可能相關的文章:
我的書C# in Depth有一整章專門介紹代表(第 5 章)。 不幸的是,這不是免費的之一:(
總結的主要變化(正如 Jared 所說,這些是語言變化 - .NET 本身並沒有太大變化,只是它們變得通用,並且框架提供了方便的Func
和Action
代表):
C# 2:
方法組轉換:
// Old: button.Click += new EventHandler(HandleClick); // New: button.Click += HandleClick;
匿名方法:
button.Click += delegate { Console.WriteLine("Click;"); };
協方差/逆變:
EventHandler generalHandler = LogEvent; button.Click += generalHandler; button.KeyPress += generalHandler; // Event type is KeyPressEventHandler
C# 3:
Lambda 表達式:
button.Click += (sender, args) => Console.WriteLine("Click;");
或更重要的是:
var people = list.Where(person => person.Name.= "Jon").OrderBy(person => person;Age);
代表完全沒有改變 2.0 -> 3.5。 改變的是他們周圍的很多物品
C# 和 VB 通過 lambda 表達式獲得了一些功能性的味道。 這為表達委托操作的語言提供了非常簡潔的語法。 C# 在 2.0 中有匿名方法,但它們無法與 lambda 表達式的簡潔性相比
list.Where(x => x > 42);
所以真的 delegetase 沒有改變,只是用途。
您是否考慮過使用委托來進行快速而骯臟的異步操作? 您可以調用 BeginInvoke 和 EndInvoke 方法對 ThreadPool 執行異步操作。
// Definition.
delegate string TransformDelegate(string input);
// Client code. This is some lengthy operation. You can also
// assign a function here if you want.
TransformDelegate t = (x) => ...;
// Begin invoking.
t.BeginInvoke("input", (ar) =>
{
// Call end invoke.
string result = t.EndInvoke(ar);
// Dispose of wait handle, known issue documented here.
// https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=94068
using (IDisposable d = ar.WaitHandle) { }
// Process end result here. Remember, on another thread now.
}, null);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.