2017-05-10 12 views
1

私はEmployeeというクラスを持っています。自動実装された3つのプロパティと、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)であることを考えて?ここでは、私はちょうどデリゲート型が期待されるところはどこでも使用することができ、インライン式で匿名メソッドのどこかを読むので、このコードはとても完璧に素敵な作業とその給与> 8000 従業員の名前を返して

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; 
      } 
     } 

です彼らは別のメソッドを記述することなくデリゲートのインスタンスを作成する方法を提供します。私のシナリオでこれを実装することができれば、定義を大きくするとコードの行が減ります。 < ===(私の質問) さて私は、リストのコレクションクラスに目的球を事前に定義)(私はラムダ式またはfindAllのでこれを行うことができます知っているが、私は匿名メソッドでそれを行うためにここにいる..

+2

Any(e => e.Salary> 8000)メソッドを使用しない理由はわかりません。私はラムダを使用したくないと思っていますが、どうしてですか? – Zorkind

+2

C#2.0ではLinqや匿名の型はサポートされていません。 – stuartd

+0

@stuartdあなたは本当ですか?私の知識では、匿名メソッドはC#2で導入されました –

答えて

1

私は理解してと仮定すると、あなたの質問が正しく、delegateキーワードは複数の用途があります。 1つの用途は、新しいデリゲート型を定義することです。もう1つの方法は匿名メソッドを作成することです。あなたが変数に代入省略して、直接メソッドに匿名メソッドを渡すことができます

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

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

...しかし、それはその行になるだろう、後者は、としてあなたの例で使用することができます少し冗長(つまり、読めない)。個人的に、私はそれを壊したままにしておきます。

+0

これは、私が尋ねていたものです、ありがとう、天才:) –

+0

しかし、1つは私をここで混乱させています。この行の目的は何ですか ボーナスB =代理人(従業員e){return e.Salary> 8000; }; –

+0

Employee.BonusForEmp(EmpList、デリゲート(従業員e)(return e.Salary> 8000;}); <==私はこの行を正確に探していました –