Ser*_*pia 2 c# anonymous-delegates
我从Microsoft下载了VCSharpSample包,并开始阅读Anonymous Delegates.我可以或多或少地理解代码在做什么,但我不明白它背后的原因.也许如果你给我一些例子,它会导致更清晰的代码和更容易维护,那么我可以绕过它.:)
你能帮我吗?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
delegate decimal CalculateBonus(decimal sales);
class Player
{
public string Name;
public decimal Score;
public decimal Bonus;
public CalculateBonus calculation_algorithm;
}
class Program
{
static decimal calculateStandardBonus(decimal sales)
{
return sales / 10;
}
static void Main(string[] args)
{
decimal multiplier = 2;
CalculateBonus standard_bonus = new CalculateBonus(calculateStandardBonus);
CalculateBonus enhanced_bonus = delegate(decimal sales) { return multiplier * sales / 10; };
Player[] players = new Player[5];
for (int i = 0; i < 5; i++)
{
players[i] = new Player();
}
players[0].Name = "Sergio";
players[0].Score = 240;
players[0].calculation_algorithm = standard_bonus;
players[1].Name = "Sergio";
players[1].Score = 240;
players[1].calculation_algorithm = enhanced_bonus;
players[2].Name = "Caro";
players[2].Score = 89;
players[2].calculation_algorithm = standard_bonus;
players[3].Name = "Andy";
players[3].Score = 38;
players[3].calculation_algorithm = enhanced_bonus;
players[4].Name = "Hugo";
players[4].Score = 600;
players[4].calculation_algorithm = enhanced_bonus;
foreach (Player player in players)
{
PerformCalculationBonus(player);
}
foreach (Player player in players)
{
DisplayPersonalDetails(player);
}
Console.ReadLine();
}
public static void PerformCalculationBonus(Player player)
{
player.Bonus = player.calculation_algorithm(player.Score);
}
public static void DisplayPersonalDetails(Player player)
{
Console.WriteLine(player.Name);
Console.WriteLine(player.Score);
Console.WriteLine(player.Bonus);
Console.WriteLine("---------------");
}
}
}
Run Code Online (Sandbox Code Playgroud)
匿名委托旨在通过在另一个方法中内联定义简单委托的行为来帮助您使代码更具可读性.这意味着如果您正在处理需要委托(例如事件处理程序)的事情,您可以在代码中定义行为,而不是为其创建专用函数.
此外,它们是lambda表达式的前身.像LINQ to Objects(任何操作方法IEnumerable<T>)之类的东西使用委托来对对象执行查询.例如,如果您有一组字符串,并且您希望查询找到长度为五个字符的所有字符串,则可以使用lambda执行此操作:
List<string> strings = ...
var query = strings.Where(s => s.Length == 5);
Run Code Online (Sandbox Code Playgroud)
或者您可以使用匿名委托来完成:
var query = strings.Where(delegate(string s) { return s.Length == 5; });
Run Code Online (Sandbox Code Playgroud)
如果您没有这些,您的代码将如下所示:
var query = strings.Where(IsFiveCharacters);
...
private bool IsFiveCharacters(string input)
{
return input.Length == 5;
}
Run Code Online (Sandbox Code Playgroud)
但是,重要的是要认识到lambdas和匿名委托只是编译器功能.当您的代码编译,它不实际创建常规功能,如在最后一个例子,但他们是隐藏的,用正在使用的语言非法字符命名.在执行诸如闭包之类的事情时(包括访问lambda /匿名委托声明之外的变量),还有许多逻辑绕过它们.
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |