委托Delegate的创建与使用

功能:委托Delegate的创建与使用

/// <summary>
/// 功能:委托Delegate的创建与使用
/// </summary>
public class DelegateTutorial
{
    // 关键字 返回值  命名  参数
    delegate void DelegateExample(int a);

    void Start()
    {
        // 方法参数与委托参数匹配才能赋值
        DelegateExample myDelegate;
        myDelegate = Foo;
        myDelegate = Bar;
        // 使用委托调用方法的两种方式   全写和简写
        myDelegate.Invoke(5);
        myDelegate(5);
        // 不创建委托   直接将委托作为方法参数使用
        FooBar(Foo);
        FooBar(Bar);
    }

    void Foo(int a) {  /* Do Something */ }
    void Bar(int a) {  /* Do Something else */ }
    void FooBar(DelegateExample myDelegate) {   myDelegate(50); }
}

public class DisplayPlayerNames
{
    delegate int ScoreDelegate(PlayerStats stats);

    void OnGameOver(PlayerStats[] allPlayerStats)
    {
        string playerNameMostKills;
        string playerNameMostFlagsCaptured;

        // 不使用委托的写法
        playerNameMostKills = GetPlayerNameMostKills(allPlayerStats);
        playerNameMostFlagsCaptured = GetPlayerNameMostFlagsCaptured(allPlayerStats);
        // 使用委托的写法   不使用匿名表达式Lambda Expressions
        playerNameMostKills = GetPlayerNameTopScore(allPlayerStats, ScoreByKillCount);
        playerNameMostFlagsCaptured = GetPlayerNameTopScore(allPlayerStats, ScoreByFlagsCaptured);
        // 使用委托的写法   使用匿名表达式Lambda Expressions
        playerNameMostKills = GetPlayerNameTopScore(allPlayerStats, stats => stats.kills);
        playerNameMostFlagsCaptured = GetPlayerNameTopScore(allPlayerStats, stats => stats.flagsCaptured);
    }

    // 获取杀敌数最多的玩家名称
    string GetPlayerNameMostKills(PlayerStats[] allPlayerStats)
    {
        string name = "";
        int bestScore = 0;
        foreach(PlayerStats stats in allPlayerStats)
        {
            int score = stats.kills;
            if(score > bestScore)
            {
                bestScore = score;
                name = stats.name;
            }
        }
        return name;
    }
    // 获取被捕获次数最多的玩家名称
    string GetPlayerNameMostFlagsCaptured(PlayerStats[] allPlayerStats)
    {
        string name = "";
        int bestScore = 0;
        foreach(PlayerStats stats in allPlayerStats)
        {
            int score = stats.flagsCaptured;
            if(score > bestScore)
            {
                bestScore = score;
                name = stats.name;
            }
        }
        return name;
    }

    // 获取给定委托中成绩最佳的玩家名称
    string GetPlayerNameTopScore(PlayerStats[] allPlayerStats, ScoreDelegate scoreCalculator)
    {
        string name = "";
        int bestScore = 0;
        foreach(PlayerStats stats in allPlayerStats)
        {
            int score = scoreCalculator(stats);
            if(score > bestScore)
            {
                bestScore = score;
                name = stats.name;
            }
        }
        return name;
    }

    int ScoreByKillCount(PlayerStats stats) { return stats.kills; }
    int ScoreByFlagsCaptured(PlayerStats stats) { return stats.flagsCaptured; }


    public class PlayerStats
    {
        public string name;
        public int kills;
        public int deaths;
        public int flagsCaptured;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_51669718/article/details/128470060