1
private delegate void stopMachineryDelegate();
public stopMachineryDelegate StopMachinery;

this.StopMachinery += new stopMachineryDelegate(painting);

上記の例の 2 行目では、デリゲート インスタンスまたはデリゲート変数を作成していますか? 2 行目でタイプ stopMachineryDelegate のデリゲート インスタンスを作成する場合、3 行目では何をしているのでしょうか。

4

2 に答える 2

2

最初の行はstopMachineryDelegate、パラメーターを受け入れず、値を返さないデリゲート ( ) として、デリゲート タイプ ( )を定義するために使用されますvoid

2行目は、という名前のそのタイプのフィールドを宣言していますStopMachinery。その時点で、StopMachinerynull です。

3 行目の背後には、構文糖衣があります。StopMachineryその時点で が null の場合、その の新しいインスタンスを作成し、メソッド デリゲートをその呼び出しリストにMulticastDelegate追加します。painting

そのフィールドに単一のデリゲートのみを割り当てたい場合は、次のように簡単に記述できます。

 // implicitly wrap the `painting` method into a new delegate and 
 // assign to the `StopMachinery` field
 this.StopMachinery = painting;  

一方、 using を使用+=すると、呼び出し時に呼び出されるデリゲートのリストを指定できますStopMachinery

 this.StopMachinery += painting;  
 this.StopMachinery += someOtherMethod;  
 this.StopMachinery += yetAnotherMethod;  

後者の場合、StopMachineryデリゲートの呼び出しは、指定された順序で、呼び出しリスト内の各メソッドを同期的に呼び出します。

于 2013-11-10T09:56:39.583 に答える
2

2 行目では、type の変数を宣言していますstopMachineryDelegate。しかし、この時点では、変数はまだ割り当てられておらず、デフォルト値の を保持していますnull

3 行目では、関数を指すデリゲートの新しいインスタンスを作成して、この変数に値を割り当てていpaintingます。

したがって、この変数が割り当てられると、それを使用して、それが指している関数を呼び出すことができます。

this.StopMachinery();

基本的paintingに同じクラスでメソッドを呼び出します。

于 2013-11-10T09:54:43.743 に答える