Event Based Programming

I read this MSDN article and this question to try to understand events in .NET. Unfortunately, they don’t click on me, and I have a lot of problems. I am trying to integrate this technique into my project with little success.

Basically, I have this class that will read numbers. Whenever he encounters a new number, I want him to fire an event called numberChanged.

So, I set my event public event EventHandler numberChanged;. Later, I fire my event when it encounters a number that does not match the previous one.

if(currentNumber != previousNumber){
     if(numberChanged != null){
          numberChanged(this, new EventArgs());
     }
}

But then I had problems with the sharing of this event. If I do numberChanged += [something to do here], the errors say that numberChanged is an event, not a type.

Is my explanation clear enough to offer any advice? Many thanks.

+4
source share
3 answers

There are several ways to deal with this: the main task is to create a function:

public void MyNumberChangedHandler(object sender, EventArgs e)
{
    //Your code goes here that gets called when the number changes
}

Then you subscribe (only once, usually in the constructor) by going:

numberChanged += MyNumberChangedHandler;

Or you can use the anonymous (lambda) method, which is also assigned in your constructor (usually):

numberChanged += (sender, e) => {
    //Your code here to handle the number changed event
};

, -, . .NET- - , , . , lambda: lambda.

, ! ( Fiddle, ) https://dotnetfiddle.net/EfNpZ5

:

I'm still alive
I'm still alive
I was disposed!
Press any key to quit
I'm still alive
I'm still alive
I'm still alive.
+5

#, . :

  • , EventHandler, () - public delegate void EventHandler(object sender, EventArgs e) [1]. , #, , , / / ..
  • , , , , - . + =. , - =. MSDN , object.event += eventHandler ( object.event += new EventHandler(eventHandler);)
  • (event Event SomeEvent;) , , - , . , EventHandler, [1] - private void numberChangedEventHandler(object sender, EventArgs eventArguments)

, + =.

:

public class NumberSequence
{
    // numbers to be compared
    private readonly List<int> numbers = new List<int>();
    // used to generate a random collection
    private readonly Random random = new Random();
    // tell me if the previous and next number are different
    public event EventHandler DifferentNumbersEvent;

    public NumberSequence()
    {
        // fill the list with random numbers
        Enumerable.Range(1, 100).ToList().ForEach(number =>
        {
            numbers.Add(random.Next(1, 100));
        });
    }

    public List<int> Numbers { get { return numbers; } }

    public void TraverseList()
    {
        for (var i = 1; i < this.numbers.Count; i++)
        {
            if (this.numbers[i - 1] != this.numbers[i])
            {
                if (this.DifferentNumbersEvent != null)
                {
                    // whoever listens - inform him
                    this.DifferentNumbersEvent(this, EventArgs.Empty);
                }
            }
        }
    }
}

, , , , ( ):

private void differentNumberEventHandler(Object sender, EventArgs eventArguments)
{
    Console.WriteLine("Different numbers...");
}

:

var ns = new NumberSequence();
ns.DifferentNumbersEvent += differentNumberEventHandler;
ns.TraverseList();

(lambda/anonymous methods/...), :

object.Event += (s, e) => { // code ... }; object.Event += (Object sender, EventArgs eventArguments) => { // code ... };. ? - , private void differentNumberEventHandler....

, , , . # , . , EventArgs , , :

public class NumbersInfoEventArgs : EventArgs
{
    public int Number1 { get; set; }
    public int Number2 { get; set; }
}

, NumbersInfoEventArgs ( ):

public event EventHandler<NumbersInfoEventArgs> DifferentNumbersEvent;
...
this.DifferentNumbersEvent(this, new NumbersInfoEventArgs
{
    Number1 = this.numbers[i - 1],
    Number2 = this.numbers[i]
});

, , :

private void differentNumberEventHandler(Object sender, NumbersInfoEventArgs eventArguments)
{
    Console.WriteLine("Different numbers {0} - {1}", eventArguments.Number1, eventArguments.Number2);
}

voila, :

Different numbers 89 - 86
Different numbers 86 - 53
Different numbers 53 - 12
Different numbers 12 - 69
+3

You can subscribe to the event this way:

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        var num = new Number();
        num.numberChanged +=(s,e) =>{
            Console.WriteLine("Value was changed to {0}",num.Value); // in the demo below you can find another implementation for this sample using custom events
        };
        num.Value=10;
        num.Value=100;
    }
}

public class Number{
    public event EventHandler numberChanged;
    private int _value=0;
    public int Value
    {
        get{
            return _value;
        }
        set{
            if(value!=_value){
                _value=value;
                if(numberChanged!=null)
                    numberChanged(this,null);
            }
        }
    }
}

explanation:

since the EventHandler delegate has 2 parameters (sender, eventArgs), as indicated here , you need to pass these parameters, and I passed them as s and e

another way to subscribe to this event is as follows:

var num = new Number();
num.numberChanged += NumberChanged_Event; // below is the delegate method

public void NumberChanged_Event(object sender,EventArgs e)
{
   // your code goes here
}

I updated the demo to work with your own delegate to convey the old value and the new value, which can help in many cases.

demo works here

+1
source

Source: https://habr.com/ru/post/1598274/


All Articles