代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

请帮助我了解匿名代理?

  •  2
  • Sergio Tapia  · 技术社区  · 15 年前

    你能帮忙吗?

    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("---------------");
            }
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Steven Sudit    15 年前

    匿名委托的目的是通过在另一个方法中定义简单委托的内联行为来帮助您提高代码的可读性。这意味着,如果您正在处理需要委托的事情(例如,事件处理程序),您可以在代码中正确定义行为,而不是为其创建专用函数。

    此外,它们是lambda表达式的前身。像LINQ to Objects(操作 IEnumerable<T> )使用委托对对象执行查询。例如,如果您有一个字符串集合,并且希望查询找到所有长度为5个字符的字符串,则可以使用lambda:

    List<string> strings = ...
    
    var query = strings.Where(s => s.Length == 5);
    

    或者你也可以通过匿名委托来完成:

    var query = strings.Where(delegate(string s) { return s.Length == 5; });
    

    var query = strings.Where(IsFiveCharacters);
    
    ...
    
    private bool IsFiveCharacters(string input)
    {
        return input.Length == 5;
    }
    

    不过,必须认识到lambda和匿名委托只是编译器的特性。在编译代码时,它 实际上像上一个例子一样创建常规函数,但是它们是隐藏的,并且使用在所用语言中非法的字符命名。在执行闭包之类的操作(访问lambda/anonymous委托声明之外的变量)时,也有很多逻辑围绕着它们。

        2
  •  1
  •   cHao    15 年前

    这样做的好处是,您不必在其他地方查找代码来执行一次性查找/更改/计算/诸如此类的操作。必须添加一个函数(或一个函数的整个其他类)有点烦人你只能在一个地方使用,然后你必须回头看看那一段代码是什么,为什么需要它,它是否仍然是。

    对于匿名委托,代码就在使用它的代码中。

    推荐文章