過去数週間、イベントについて混乱してきました。デリゲートがどのように機能するかは理解していますが、それがどのように機能するかは詳細ではありませんが、それ
delegate datatype
が単一のキャスト デリゲートであることを知るには十分です。
delegate void
メソッドへの参照のリストであるマルチキャスト デリゲートです。
デリゲート型がクラスにコンパイルされることは知っていますが、残念ながらメソッドがどのように参照されるのかはまだわかりません。例えば
delegate void TestDelegate();
TestDelegate testDelegate = new TestDelegate(myObject.SomeMethod) ;
質問 1: myObject がターゲットで、SomeMethod が参照するメソッドだと思いますが、入力を 1 つだけ渡しています。myObject.SomeMethod は文字列にコンパイルされ、文字列はピリオドで分割されますか? ばかげている私は知っています。
質問 2: マルチキャスト デリゲートに追加する場合
multicastdelegate+=newmethodtobereference
multicastdelegate() ;
呼び出しリスト内のすべてのメソッドが呼び出されるか、または通知されますか? それが本当なら、なぜイベントやevent
キーワードが必要なのですか? これはイベントとして機能していることを単に開発者に伝えるためですか? 本気で迷っているので、この段階で進めたいと思います笑。これは、イベント キーワードが必要かどうかをテストするために今日書いたサンプル コードです。
using System;
namespace LambdasETs
{
public delegate void IsEvenNumberEventHandler(int numberThatIsEven);
public class IsEvenNumberFound
{
public IsEvenNumberEventHandler IsEvenNumberEvent;
private int number;
public void InputNumber(int n)
{
if(number %2 ==0)
{
if (IsEvenNumberEvent != null)
{
IsEvenNumberEvent(n);
}
}
}
public static void Main()
{
IsEvenNumberFound isEvenNumberFound = new IsEvenNumberFound();
isEvenNumberFound.IsEvenNumberEvent += IsEvenNumberAction;
isEvenNumberFound.InputNumber(10);
Console.ReadLine();
}
public static void IsEvenNumberAction(int number)
{
Console.WriteLine("{0} is an even number!", number);
}
}
}
event キーワードをフィールドに追加しpublic IsEvenNumberEventHandler IsEvenNumberEvent;
ても違いはありません。初心者が理解できるように説明してください。