c# - Can I use something else instead of "this" in this code? -


using system; using system.collections.generic; using system.linq; using system.text; using system.threading.tasks;  namespace event_training {     class publisher     {         public event eventhandler x;          public void raise()         {             x(this, null);         }      }      class subscriber     {         public void method1(object o, eventargs e)         {             console.writeline("metod1 called");         }          public void method2(object o, eventargs e)         {             console.writeline("metod2 called");         }     }       class program     {         static void main(string[] args)         {             publisher p = new publisher();             subscriber s = new subscriber();              p.x += s.method1;             p.x += s.method2;              p.raise();         }     } } 

having hard time understrand "this" keyword. refer "x(this, null);" in here? can use else instead of "this"?

why need pass instance of publisher? assume have several publishers , 1 subscriber:

 publisher p1 = new publisher() { name = "bob" };  publisher p2 = new publisher() { name = "joe" };  subscriber s = new subscriber(); 

you subscribe x event of both publishers:

 p1.x += s.method1;  p2.x += s.method1; 

now question - how know publisher raised event in event handle?

public void method1(object o, eventargs e) {     console.writeline("metod1 called"); } 

that's why default eventhandler delegate has 2 parameters. first 1 called sender instead of o. able check sender , understand publisher raised event. assume publisher has name property:

class publisher {     public event eventhandler x;     public string name { get; set; }              public void raise()     {        eventhandler x = this.x;        if (x != null)           x(this, eventargs.empty);     } } 

now in event handler can name of publisher, because have passed publisher instance (this) handler:

public void method1(object sender, eventargs e) {     publisher publisher = (publisher)sender;     console.writeline(publisher.name + " raised event x"); } 

if don't need pass event args , instance of object raised event, can use other type of delegate event. e.g. action delegate not have parameters.

class publisher {     public event action x;            public void raise()     {        action x = this.x;        if (x != null)           x(); // no parameters     } } 

and handler like:

public void method1() {     console.writeline("metod1 called"); } 

Comments

Popular posts from this blog

javascript - Chart.js (Radar Chart) different scaleLineColor for each scaleLine -

apache - Error with PHP mail(): Multiple or malformed newlines found in additional_header -

java - Android – MapFragment overlay button shadow, just like MyLocation button -