功能:委托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;
}
}