私は 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