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;
        }
    }
}

results matching ""

    No results matching ""