デリゲートを使用するタイミングと理由 [重複] 質問する

デリゲートを使用するタイミングと理由 [重複] 質問する

私は C# の初心者で、デリゲートをいつ適切に使用すればよいのか疑問に思っています。デリゲートはイベント宣言で広く使用されていますが、自分のコードではいつ使用すればよいのでしょうか。また、デリゲートが便利なのはなぜでしょうか。 他のものを使用しないのはなぜでしょうか。

また、デリゲートを使用する必要があるとき、他に選択肢がないかどうかも疑問です。

お手伝いありがとう!

編集:デリゲートの必要な使い方を見つけたと思います ここ

ベストアンサー1

デリゲートはメソッドへの参照です。オブジェクトはメソッド、コンストラクターなどにパラメーターとして簡単に送信できますが、メソッドの場合は少し複雑です。しかし、ときどき、メソッドを別のメソッドにパラメーターとして送信する必要を感じることがあります。その場合、デリゲートが必要になります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateApp {

  /// <summary>
  /// A class to define a person
  /// </summary>
  public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
  }

  class Program {
    //Our delegate
    public delegate bool FilterDelegate(Person p);

    static void Main(string[] args) {

      //Create 4 Person objects
      Person p1 = new Person() { Name = "John", Age = 41 };
      Person p2 = new Person() { Name = "Jane", Age = 69 };
      Person p3 = new Person() { Name = "Jake", Age = 12 };
      Person p4 = new Person() { Name = "Jessie", Age = 25 };

      //Create a list of Person objects and fill it
      List<Person> people = new List<Person>() { p1, p2, p3, p4 };

      //Invoke DisplayPeople using appropriate delegate
      DisplayPeople("Children:", people, IsChild);
      DisplayPeople("Adults:", people, IsAdult);
      DisplayPeople("Seniors:", people, IsSenior);

      Console.Read();
    }

    /// <summary>
    /// A method to filter out the people you need
    /// </summary>
    /// <param name="people">A list of people</param>
    /// <param name="filter">A filter</param>
    /// <returns>A filtered list</returns>
    static void DisplayPeople(string title, List<Person> people, FilterDelegate filter) {
      Console.WriteLine(title);

      foreach (Person p in people) {
        if (filter(p)) {
          Console.WriteLine("{0}, {1} years old", p.Name, p.Age);
        }
      }

      Console.Write("\n\n");
    }

    //==========FILTERS===================
    static bool IsChild(Person p) {
      return p.Age < 18;
    }

    static bool IsAdult(Person p) {
      return p.Age >= 18;
    }

    static bool IsSenior(Person p) {
      return p.Age >= 65;
    }
  }
}

出力:

Children:
Jake, 12 years old


Adults:
John, 41 years old
Jane, 69 years old
Jessie, 25 years old


Seniors:
Jane, 69 years old

おすすめ記事