.NET委託,事件和Lambda表示式
阿新 • • 發佈:2020-09-12
# 委託
## 委託是什麼?
委託是一種引用型別(其實就是一個類,繼承MulticastDelegate特殊的類。),表示對具有特定引數列表和返回型別的方法的引用。
每個委託提供Invoke方法, BeginInvoke和EndInvoke非同步方法
## 為什麼需要委託?
* 委託可以將方法(即邏輯)作為引數;
* 邏輯解耦,保持穩定。
* 程式碼複用,保證專案規範。
## 如何使用委託?
### 如何宣告、例項化和使用委託
宣告委託
delegate void Del(string str);
static void Notify(string name)
{
Console.WriteLine($"Notification received for: {name}");
}
例項化委託
Del del1 = new Del(Notify);
//C# 2.0
Del del2 = Notify;
呼叫委託
del1.Invoke("小明");
del2("小明");
其他使用委託
//C# 2.0使用匿名方法來宣告和例項化委託
Del del3 = delegate(string name)
{ Console.WriteLine($"Notification received for: {name}"); };
//C# 3.0使用lambda表示式宣告和例項化委託
Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
簡化開發過程,.NET 包含一組委託型別:
* Action<> 具有引數且不返回值。
* Func<> 具有引數且返回由引數指定的型別的值。
* Predicate<> 用於確定引數是否滿足委託條件的情況。
## 實際案例
程式碼:
class Program
{
///
/// 宣告委託
///
///
private delegate void KillDelegate(string fullName);
static void Main(string[] args)
{
//例項化委託
var killWithKnifeDelegate = new KillDelegate(KillWithKnife);
Kill("郭靖", killWithKnifeDelegate);
var killWithSwordDelegate = new KillDelegate(KillWithSword);
Kill("黃蓉", killWithSwordDelegate);
var killWithAxeDelegate = new KillDelegate(KillWithAxe);
Kill("歐陽克", killWithAxeDelegate);
Console.ReadKey();
}
static void Kill(string fullName, KillDelegate killDelegate)
{
Console.WriteLine($"{fullName}遇到怪物");
//呼叫委託
killDelegate.Invoke(fullName);
Console.WriteLine($"{fullName}增長10經驗");
}
static void KillWithKnife(string fullName)
{
Console.WriteLine($"{fullName}用刀殺怪物");
}
static void KillWithSword(string fullName)
{
Console.WriteLine($"{fullName}用劍殺怪物");
}
static void KillWithAxe(string fullName)
{
Console.WriteLine($"{fullName}用斧殺怪物");
}
}
# Lambda表示式
## Lambda是什麼?
Lambda就是使用委託的更方便的語法。
//C# 2.0使用匿名方法來宣告和例項化委託
Del del3 = delegate(string name)
{ Console.WriteLine($"Notification received for: {name}"); };
//C# 3.0使用lambda表示式宣告和例項化委託
Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); };
## 為什麼需要Lambda?
簡化開發過程,並不會影響執行效能。
## 如何使用Lambda?
表示式lambda基本形式:
//僅當 lambda 只有一個輸入引數時,括號才是可選的;否則括號是必需的
(input-parameters) => expression
使用空括號指定零個輸入引數:
Action line = () => Console.WriteLine();
括號內的兩個或更多輸入引數使用逗號加以分隔: