DELEGATE 委派
◎ 第一個 DELEGATE 簡單的例子
using System;
using System.Collections.Generic;
namespace DelegateDemo
{
//宣告 Delegate
/// <summary>
/// 注意:Delegate 括號內的參數之型態與數量以及回傳的型態(e.g:void、int、string...等),一定要與 Delegate 要去執行的 Function 括號內所接收的參數型態與數量要一致!!!
/// </summary>
public delegate void DelegateNameABC(string str);
class Program
{
static void Main(string[] args)
{
//呼叫靜態方法印文字
Program.Print("方法一:Program.Print");
//使用 Delegate 的方式印文字
//()內是傳入要執行的方法
#region 中規中矩寫法
DelegateNameABC del1 = new DelegateNameABC(Print);
del1(@"方法二:這裡傳入要印出來的文字!!!");
#endregion
#region .Net Framework 熱門寫法
DelegateNameABC del2 = Print;
del2(@"方法三:這裡傳入要印出來的文字!!!");
#endregion
//匿名使用Delegate
new DelegateNameABC(Print)(@"方法三:匿名使用Delegate!!!");
Console.ReadLine();
}
//印文字的靜態方法
public static void Print(string strMsg)
{
Console.WriteLine(strMsg);
}
}
}
◎ 第二個 DELEGATE 的例子
比第一個例子稍微難一點點
using System;
using System.Collections.Generic;
using OnlineGame;//第二個Namespace
namespace DelegateDemo
{
class Program
{
static void Main(string[] args)
{
List<Gamer> gamerList = new List<Gamer>();
gamerList.Add(new Gamer(1, "Name01"));
gamerList.Add(new Gamer { Id = 2, Name = "Name02", Level = 20, Experience = 5000 });
gamerList.Add(new Gamer { Id = 3, Name = "Name03", Level = 14, Experience = 4500 });
gamerList.Add(new Gamer { Id = 4, Name = "Name04", Level = 19, Experience = 6000 });
gamerList.Add(new Gamer { Id = 5, Name = "Name05", Level = 32, Experience = 8000 });
foreach (Gamer gamer in gamerList)
{
gamer.toString();
}
Console.WriteLine("****** 執行 Delegate 之後 ******");
Gamer.LevelUp(gamerList, new IsLevelUp(CanLevelUp), new DoingLevelUp(LevelIncreased));
foreach (Gamer gamer in gamerList)
{
gamer.toString();
}
Console.ReadLine();
}
public static bool CanLevelUp(Gamer gamer)
{
return gamer.Experience >= 1000 && gamer.Hp >= 1;
}
public static void LevelIncreased(Gamer gamer)
{
gamer.Level++;
gamer.Experience -= 1000;
gamer.Hp += 100;
gamer.Mp += 100;
}
}
}
namespace OnlineGame
{
//宣告 Delegate
/// <summary>
/// 注意:Delegate 括號內的參數之型態與數量以及回傳的型態(e.g:void、int、string...等),一定要與 Delegate 要去執行的 Function 括號內所接收的參數型態與數量要一致!!!
/// </summary>
public delegate bool IsLevelUp(Gamer gamer);
public delegate void DoingLevelUp(Gamer gamer);
public class Gamer
{
#region Field
public int Id { get; set; }
public string Name { get; set; }
public int Hp { get; set; }
public int Mp { get; set; }
public int GameScore { get; set; }
public int Experience { get; set; }
public int Level { get; set; }
#endregion
#region Constructor 建構式
//List<Gamer> gamerList = new List<Gamer>();
//gamerList.Add(new Gamer(1, "Name01"));
public Gamer(int id, string name, int hp = 1, int mp = 1, int gameScore = 0, int experience = 0, int level = 1)
{
Id = id;
Name = name;
Hp = hp;
Mp = mp;
GameScore = gameScore;
Experience = experience;
Level = level;
}
////List<Gamer> gamerList = new List<Gamer>();
////gamerList.Add(new Gamer{Id=1, Name = "Name01"});
public Gamer()
{
Id = 0;
Name = "";
Hp = 1;
Mp = 1;
GameScore = 0;
Experience = 0;
Level = 1;
}
#endregion
public static void LevelUp(List<Gamer> gamerList, IsLevelUp isLevelUp, DoingLevelUp doingLevelUp)
{
foreach (Gamer gamer in gamerList)
{
if (isLevelUp(gamer))
{
doingLevelUp(gamer);
}
}
}
public void toString()
{
Console.WriteLine("id={0}, name={1}, hp={2}, mp={3}, gameScore={4}, experience={5}, level={6}", Id, Name, Hp, Mp, GameScore, Experience, Level);
}
}
}
◎ 第三個 DELEGATE 的例子
這個例子要說明:
- 可以執行有 out keyword Function 的 Delegate
- 如果 Delegate 用 += 串接起來,執行後的結果只會有最後一個 Function 的結果
using System;
using System.Collections.Generic;
namespace DelegateDemo
{
//宣告 Delegate
/// <summary>
/// 注意:Delegate 括號內的參數之型態與數量以及回傳的型態(e.g:void、int、string...等),一定要與 Delegate 要去執行的 Function 括號內所接收的參數型態與數量要一致!!!
/// </summary>
public delegate int DelegateIntSum(out int total);
class Program
{
static void Main(string[] args)
{
DelegateIntSum del = Sum1;
del += Sum2;
del += Sum3;
int temp = 0;
del(out temp);
Console.WriteLine(temp);
Console.ReadLine();
}
//印文字的靜態方法
public static int Sum1(out int i)
{
return i = 1;
}
public static int Sum2(out int v)
{
return v = 2;
}
public static int Sum3(out int y)
{
return y = 3;
}
}
}