[英]My code returns a StackOverFlowException when I enter a name… I don't understand why
My code's purpose is to change my 'dispatcher' object's name and whilst this is done through the dispatcher's name property's setter, it runs OnNameChange() where I raise the event. 我的代码的目的是更改“调度程序”对象的名称,尽管这是通过调度程序的name属性的设置器完成的,但它运行OnNameChange()引发事件。
This is where I want the "OnDispatcherNameChange" method to be run where it displays a message ("Dispatcher's name changed to "). 这是我要在其中显示消息的地方运行“ OnDispatcherNameChange”方法的地方(“ Dispatcher的名称更改为”)。
However, when I run the main, and enter a name, it returns a StackOverFlowException. 但是,当我运行main并输入名称时,它将返回StackOverFlowException。 How can I fix this? 我怎样才能解决这个问题?
This is my code: 这是我的代码:
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;
}
}
}
}
The Name property is the problem. 名称属性是问题。 You have an infinite loop where the setter is calling the property again to set another value. 您有一个无限循环,在该循环中,setter再次调用该属性以设置另一个值。
Change it to use a backing field: 更改它以使用后备字段:
private string _name;
public string Name
{
get
{
return _name;
}
set
{
var nameChange = new NameChangeEventArgs(Name);
OnNameChange(nameChange);
_name = value;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.