研究事件这个话题,我给自己构思了一个任务:如果产生了给定的数字,那么就触发一个事件。我定义了将生成数字的代码:
delegate void RightNumber(object sendler, EventArguments e);
class Produce
{
public event RightNumber NumberFound;
private int rightNumber;
Random random = new Random();
public Produce(int rightNumber)
{
this.rightNumber = rightNumber;
}
public void FindNumber()
{
for (int counter = 0; counter < 100; counter++)
{
int newValue = random.Next(10);
if (newValue == rightNumber)
NumberFound(this, new EventArguments(rightNumber));
}
}
}
class EventArguments
{
public int rightNumber
{
get
{
return rightNumber;
}
private set
{
rightNumber = value;
}
}
public EventArguments(int rightNumber)
{
this.rightNumber = rightNumber;
}
}
以及程序的调用部分:
public static void Main()
{
Console.WriteLine("Введите задуманное число");
string str = Console.ReadLine();
int rightNumber = Convert.ToInt32(str);
Produce produce = new Produce(rightNumber);
produce.NumberFound += DisplayResult;
produce.FindNumber();
Console.ReadKey();
}
public static void DisplayResult(object sendler, EventArguments e)
{
Console.WriteLine($"Найдено загаданное число {e.rightNumber}");
}
执行程序时,控制台抛出 Process is terminate due to StackOverflowException,环境指向这段代码:

如果找到所需的号码,就会出现问题。我尝试进行调试,但由于我的经验不足,我无法弄清楚。
我还想听听关于代码风格的评论。一般来说,怎样才能做得更好?
因此,让我们了解您的问题:
首先,您最好知道StackOverflowException是什么:
通常,这个异常的出现是由于无限递归,它潜伏在你的代码中(顺便说一下,这个异常不仅可以在代码错误循环时出现,而且如上所述,由于调用嵌套过多某种递归方法)
递归隐藏在代码中的什么位置?实际上,它
Visual Studio清楚地向您指出了这个地方:这段代码有什么问题?让我们看一下:让我们
从 开始
get:您
return指定了调用它的相同属性,即rightNumber。于是,得到如下图:以此类推,无止境。该属性以递归方式引用自身。所以这个值永远不会被接收到,因为为了得到它,我们进入了我们的属性的 getter,它返回一个 value
rightNumber,为了得到它的值,我们再次爬进它的 getter,等等。继续
set,您的错误在其中爬出:再次,您表示该属性本身已
rightNumber分配value。也就是说,在这种情况下,与上面的示例类似,您递归调用rightNumber->set:再一次,这种情况无止境地继续下去。因为该属性仍然指代它自己。
如何解决问题?非常简单:您需要将您的属性定义替换为
或
在第一种情况下,您将使用所谓的自动实现的属性(有条件地,第二个选项中描述的内容将自动实现并隐藏在您的眼睛之外。您可以使用反射
backingField检测创建的)我希望我的回答可以帮助你,也希望你能理解你所犯的错误,不再重蹈覆辙)
祝你好运!