2017-05-10 3 views
1

Ich habe eine Klasse namens Employee. in dem es drei automatisch implementierte Eigenschaften und eine Funktion gibt, die die Namen der Angestellten zurückgibt, die Bonusgehalt haben, verwende ich Delegierte, also gibt es keine Logik in dieser Funktion und das ist der Grund, warum diese Klasse und Methode wiederverwendbar ist.Verwirrung in der anonymen Methode

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 

Hier ist es mein Hauptverfahren, in dem ich eine Liste der Mitarbeiter zu schaffen und alle Schritte zu tun, wie eine Instanz erstellen und die Methode als Argument übergeben.

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(); 

So Alle von euch denken, dass, wo meine Methode ist (BonusAvailableFor), in dem ich die logische Arbeit tat alles, was die Unterschrift des Delegierten übereinstimmt? Hier ist sie

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

Also dieser Code funktioniert so perfekt schön und wiederkehr die Namen der Mitarbeiter, deren Gehalt> 8000. ich nur anonyme Methode irgendwo gelesen, dass Inline-Ausdruck ist, die verwendet werden können, wo immer ein Delegattyp erwartet wird .Sie bieten uns eine Möglichkeit, Instanz von Delegaten zu erstellen, ohne eine separate Methode schreiben zu müssen ... die Definition sieht gut aus, es wird meine Codezeilen reduzieren, wenn ich dies in meinem Szenario implementieren kann, also wie kann ich es erreichen? < === (Meine Frage) gut ich weiß, ich diesen Ausdruck mit Lambda tun können, oder mit FindAll() vordefinieren funtion in Liste Sammlung Klasse, aber ich bin hier mit anonymer Methode zu tun ..

+2

Ich verstehe nicht, warum Sie nicht nur die Any (e => e.Salary> 8000) -Methode verwenden. Ich verstehe, dass Sie nicht Lambda verwenden möchten, aber warum nicht? – Zorkind

+2

C# 2.0 unterstützt Linq oder anonyme Typen nicht. Wollten Sie die Frage wirklich damit versehen? – stuartd

+0

@stuartd bist du sicher? In meinem Wissen Anonym Methode in C# eingeführt 2 –

Antwort

1

Unter der Annahme, ich verstehe Ihre Fragen korrekt, das delegate Schlüsselwort hat mehrere Verwendungen. Eine Verwendung besteht darin, einen neuen Delegattyp zu definieren. Die andere Möglichkeit besteht darin, eine anonyme Methode zu erstellen. Letzteres kann wie in Ihrem Beispiel verwendet werden:

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

können Sie weglassen auf die Variable zuweisen und die anonyme Methode direkt an die Methode übergeben:

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

... aber das würde diese Zeile machen ein bisschen ausführlich (dh unlesbar). Persönlich würde ich es ausgebrochen lassen.

+0

Dies ist, was ich fragte, danke Genius :) –

+0

Aber eine Sache verwirrte mich hier Was ist der Zweck dieser Linie Bonus B = Delegat (Mitarbeiter e) {return e.Salary> 8000; }; –

+0

Employee.BonusForEmp (EmpList, Delegat (Employee e) {return e.Salary> 8000;}); <== Ich suchte genau nach dieser Zeile –

Verwandte Themen