Let's take a look at a small example before getting multiple return values:
Private void button#click (Object sender, eventargs E)
{
Int number = 200; // set the value of number to 200.
Publishser pub = new publishser (); // instantiate publishser
Subscriber1 sub1 = new subscriber1 (); // instantiate subscriber1
Subscriber2 sub2 = new subscriber2 (); // instantiate subscriber2
Subscriber3 sub3 = new subscriber3 (); // instantiate subscriber3
Pub. numberchanged + = sub1.onnumberchanged; // bind the method to the Delegate
Pub. numberchanged + = sub2.onnumberchanged;
Pub. numberchanged + = sub3.onnumberchanged;
Pub. docomething (number); // call docomething
}
Class publishser
{
Public Delegate int demoeventhandler (INT num); // defines the delegate, which can represent an integer method.
Public event demoeventhandler numberchanged; // declare the event
Public void docomething (INT temp)
{
If (numberchanged! = NULL)
{
Temp = numberchanged (temp );
}
MessageBox. Show (temp. tostring ());
}
}
Class subscriber1
{
Public int onnumberchanged (INT num)
{
MessageBox. Show ("subscriber1 class called, num value:" + num );
Return num + 100 ;;
}
}
Class subscriber2
{
Public int onnumberchanged (INT num)
{
MessageBox. Show ("the value of the num class of subscriber2 called is:" + num );
Return num + 100;
}
}
Class subscriber3
{
Public int onnumberchanged (INT num)
{
MessageBox. Show ("subcriber3 class called, num value:" + num );
Return num + 100;
}
}
I thought the result was:
The subscriber1 class is called. The num value is 200.
The subscriber2 class is called. The num value is 300.
The subscriber3 class is called. The num value is 400.
500
But after the program runs, the result is not what I think. The result is:
The subscriber1 class is called. The num value is 200.
The subscriber2 class is called. The num value is 200.
The subscriber3 class is called. The num value is 200.
300
After the problem is found, I use a statement-by-statement method to debug the program. I found that when numberchanged! = NULL after subscriber1 is called for the first time, it does not return to the publishser class, nor does it execute the return of subscriber1. Instead, it calls subscriber2 directly, and the Temp value is still 200 at the beginning. Call subscriber3 after execution. The value of temp is 300 only after subscriber3 is executed. (Now I don't know why this happens, but I learned a method on the Internet to get multiple returned values !)
Certificate ---------------------------------------------------------------------------------------------------------------------------------------
Obtain multiple return values:
Private void button#click (Object sender, eventargs E)
{
Int number = 200;
Publishser pub = new publishser ();
Subscriber1 sub1 = new subscriber1 ();
Subscriber2 sub2 = new subscriber2 ();
Subscriber3 sub3 = new subscriber3 ();
Pub. numberchanged + = sub1.onnumberchanged;
Pub. numberchanged + = sub2.onnumberchanged;
Pub. numberchanged + = sub3.onnumberchanged;
Pub. docomething (number );
}
Class publishser
{
Public Delegate int demoeventhandler (INT num );
Public event demoeventhandler numberchanged;
Public void docomething (INT temp)
{
If (numberchanged! = NULL)
{
Delegate [] delarray = numberchanged. getinvocationlist ();
Foreach (delegate del in delarray)
{
Demoeventhandler method = (demoeventhandler) del;
Temp = method (temp );
}
}
MessageBox. Show (temp. tostring ());
}
}
Class subscriber1
{
Public int onnumberchanged (INT num)
{
MessageBox. Show ("subscriber1 class called, num value:" + num );
Return num + 100 ;;
}
}
Class subscriber2
{
Public int onnumberchanged (INT num)
{
MessageBox. Show ("the value of the num class of subscriber2 called is:" + num );
Return num + 100;
}
}
Class subscriber3
{
Public int onnumberchanged (INT num)
{
MessageBox. Show ("subcriber3 class called, num value:" + num );
Return num + 100;
}
}
The running result is:
The subscriber1 class is called. The num value is 200.
The subscriber2 class is called. The num value is 300.
The subscriber3 class is called. The num value is 400.
500
Now I think of the results. Using the getinvocationlist () Static Method of the delegate base class, you can get the delegate linked list, and then traverse the delegate linked list and execute it in sequence to get the return values of each method.