Мой код возвращает StackOverFlowException при вводе имени ... Я не понимаю, почему - PullRequest
2 голосов
/ 21 июня 2019

Цель моего кода - изменить имя объекта моего «диспетчера», и, хотя это делается с помощью установщика свойства name диспетчера, он запускает OnNameChange (), где я вызываю событие.

Здесь я хочу, чтобы метод «OnDispatcherNameChange» запускался там, где он отображает сообщение («Имя диспетчера изменено на»).

Однако, когда я запускаю main и ввожу имя, он возвращает исключение StackOverFlowException. Как я могу это исправить?

Это мой код:

using System;

namespace Excercise_Events
{

    public class NameChangeEventArgs : EventArgs
    {
        public string Name { get; private set; }

        public NameChangeEventArgs(string name)
        {
            this.Name = name;
        }
    }
    public class Dispatcher
    {
        public string Name
        {
            get
            {
                return Name; 
            }
            set
            {
                var nameChange = new NameChangeEventArgs(Name);
                OnNameChange(nameChange);

                Name = value; 
            } 
        }

        public delegate void NameChangeEventHandler(object Source, NameChangeEventArgs args);

        public event NameChangeEventHandler NameChange;

        protected virtual void OnNameChange(NameChangeEventArgs args)
        {
            NameChange?.Invoke(this, new NameChangeEventArgs(args.Name));
        }

    }

    public class Handler
    {
        public void OnDispatcherNameChange(object Source, NameChangeEventArgs args)
        {
            Console.WriteLine("Dispatcher's name changed to {0}", args.Name);
        } 
    }

    class Program
    {
        static void Main(string[] args)
        {
            var dispatcher = new Dispatcher();
            var handler = new Handler();

            dispatcher.NameChange += handler.OnDispatcherNameChange;

            while (true)
            {
                Console.Write("Enter new Name: ");
                string name = Console.ReadLine();
                if (name.ToLower() == "end")
                {
                    break; 
                }
                dispatcher.Name = name;
            }
         }
    }
}

1 Ответ

3 голосов
/ 21 июня 2019

Свойство Name является проблемой.У вас есть бесконечный цикл, в котором установщик снова вызывает свойство, чтобы установить другое значение.

Измените его на вспомогательное поле:

private string _name;

public string Name
{
    get
    {
        return _name; 
    }
    set
    {
        var nameChange = new NameChangeEventArgs(Name);
        OnNameChange(nameChange);

        _name = value; 
     } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...