匿名方法中的困惑

时间:2017-05-10 13:08:14

标签: c#

我有一个叫做Employee的课程。其中有三个自动实现的属性和一个返回git奖金工资的员工姓名的函数,我使用委托,所以这个函数没有逻辑,这就是这个类和方法可重用的原因。

class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Salary { get; set; }
        public static void BonusForEmp(List<Employee> emp, Bonus Isavailable)
        {
            foreach (Employee e in emp)
            {
                if (Isavailable(e))
                {
                    Console.WriteLine(e.Name + " got bonus");
                }
            }
        }

    }

     delegate bool Bonus(Employee Employes); // Delegate

这是我的主要方法,我在其中创建员工列表并执行所有步骤,例如创建实例并将方法作为参数传递。

List<Employee> EmpList = new List<Employee>();
            EmpList.Add(new Employee() { Id = 1, Name = "A", Salary = 12000});
            EmpList.Add(new Employee() { Id = 2, Name = "B", Salary = 7999 });
            EmpList.Add(new Employee() { Id = 3, Name = "C", Salary = 1999 });
            EmpList.Add(new Employee() { Id = 4, Name = "D, Salary = 20000});
            Bonus B = new Bonus(BonusAvailabeFor); //instance of dlegate and pasing method name as an argument
            Employee.BonusForEmp(EmpList, B); //using 
            Console.ReadLine();

所以你们所有人都在想我的方法(BonusAvailableFor)在哪里我完成了与委托签名相匹配的所有逻辑工作?这是

 public static bool BonusAvailabeFor(Employee eml) // the function with same signature of the delegate here we use our logic.
        {
            if (eml.Salary > 8000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

所以这段代码工作非常好,并返回员工的姓名,其薪水&gt; 8000。 我只是在某处读取了一个内联表达式的匿名方法,可以在任何需要委托类型的地方使用。它为我们提供了一种创建委托实例的方法,而无需编写单独的方法..定义看起来很棒它会减少我的行代码,如果我可以在我的场景中实现这一点,那么我怎样才能实现它? &lt; ===(我的问题) 我知道我可以用Lambda表达式或FindAll()预定义函数在列表集合类中做到这一点,但我在这里用匿名方法来做..

1 个答案:

答案 0 :(得分:1)

假设我正确理解了您的问题,delegate关键字有多种用途。一种用途是定义新的委托类型;另一个用途是创建一个匿名方法。后者可以在您的示例中用作:

Bonus B = delegate (Employee e) { return e.Salary > 8000; };

您可以省略分配给变量并将匿名方法直接传递给方法:

Employee.BonusForEmp(EmpList, delegate (Employee e) { return e.Salary > 8000; });

...但这会使该行有点冗长(即不可读)。就个人而言,我会把它打破。