2017-05-10 1 views
1

J'ai une classe appelée Employee. dans lequel il y a trois propriétés implémentées automatiquement et une fonction qui retourne les noms des employés qui gitent le salaire bonus, j'utilise des délégués donc il n'y a pas de logique dans cette fonction et c'est la raison pour laquelle cette classe et méthode sont réutilisables.Confusion dans la méthode anonyme

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 

Ici, il est ma méthode principale dans laquelle je crée une liste des employés et de faire toutes les étapes comme la création d'une instance et en passant la méthode comme argument.

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

Alors vous tous penser que là où est ma méthode (BonusAvailableFor) dans lequel je l'ai fait tout le travail logique qui correspond à la signature du délégué? Ici, il est

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

Donc, ce code fonctionne si parfaitement agréable et retourner les noms des employés dont le salaire> 8000. Je viens de lire la méthode anonyme quelque part qui est l'expression en ligne qui peut être utilisé chaque fois qu'un type délégué devrait .Ils nous fournissent un moyen de créer une instance de délégué sans avoir à écrire une méthode séparée .. la définition est belle, il va réduire mes lignes de code si je peux implémenter cela dans mon scénario, alors comment puis-je l'obtenir? < === (Ma question) Eh bien, je sais que je peux le faire avec l'expression Lambda ou FindAll() prédéfinir funtion en classe de collection de la liste, mais je suis ici pour le faire avec méthode anonyme ..

+2

Je ne comprends pas pourquoi vous n'utilisez pas simplement la méthode Any (e => e.Salary> 8000). Je comprends que vous ne voulez pas utiliser lambda, mais pourquoi pas? – Zorkind

+2

C# 2.0 ne supporte pas Linq ou les types anonymes, vouliez-vous vraiment étiqueter la question avec ça? – stuartd

+0

@stuartd en êtes-vous sûr? Dans ma connaissance Anonyme méthode ont été introduites dans C# 2 –

Répondre

1

En supposant que je comprends vos questions correctement, le mot-clé delegate a plusieurs usages. Une utilisation consiste à définir un nouveau type de délégué; l'autre usage est de créer une méthode anonyme. Ce dernier peut être utilisé dans votre exemple que:

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

Vous pouvez omettre l'affectation à la variable et de transmettre la méthode anonyme directement à la méthode:

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

... mais ce serait cette ligne un peu verbeux (c'est-à-dire illisible). Personnellement, je le laisserais brisé.

+0

Voici ce que je demandais, Thankyou Genius :) –

+0

Mais une chose me confond ici Quel est le but de cette ligne Bonus B = délégué (employé e) {return e.Salary> 8000; } –

+0

Employee.BonusForEmp (EmpList, délégué (Employee e) {return e.Salary> 8000;}); <== Je cherchais exactement cette ligne –