RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 858100
Accepted
Алексей Федотов
Алексей Федотов
Asked:2020-07-20 18:16:35 +0000 UTC2020-07-20 18:16:35 +0000 UTC 2020-07-20 18:16:35 +0000 UTC

如果生成正确的数字,则引发事件,由于 StackOverflowException 而终止进程 [重复]

  • 772
这个问题已经在这里得到了回答:
c#stackoverflow异常 1个回答
4年前关闭。

研究事件这个话题,我给自己构思了一个任务:如果产生了给定的数字,那么就触发一个事件。我定义了将生成数字的代码:

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,环境指向这段代码: 在此处输入图像描述

如果找到所需的号码,就会出现问题。我尝试进行调试,但由于我的经验不足,我无法弄清楚。

我还想听听关于代码风格的评论。一般来说,怎样才能做得更好?

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Kir_Antipov
    2020-07-20T19:45:41Z2020-07-20T19:45:41Z

    因此,让我们了解您的问题:

    首先,您最好知道StackOverflowException是什么:

    由于嵌套方法调用次数过多而在运行堆栈溢出时引发的异常

    通常,这个异常的出现是由于无限递归,它潜伏在你的代码中(顺便说一下,这个异常不仅可以在代码错误循环时出现,而且如上所述,由于调用嵌套过多某种递归方法)


    递归隐藏在代码中的什么位置?实际上,它Visual Studio清楚地向您指出了这个地方:

    public int rightNumber
    {
        get
        {
            return rightNumber;
        }
        private set
        {
            rightNumber = value;
        }
    }
    

    这段代码有什么问题?让我们看一下:让我们

    从 开始get:
    您return指定了调用它的相同属性,即rightNumber。于是,得到如下图:

    int x = rightNumber; // вызывается return rightNumber внутри rightNumber->get
        return rightNumber; // снова вызывается return rightNumber внутри rightNumber->get 
            return rightNumber; // и снова вызывается return rightNumber внутри rightNumber->get 
                return rightNumber; // и опять вызывается return rightNumber внутри rightNumber->get 
                    ...
    

    以此类推,无止境。该属性以递归方式引用自身。所以这个值永远不会被接收到,因为为了得到它,我们进入了我们的属性的 getter,它返回一个 value rightNumber,为了得到它的值,我们再次爬进它的 getter,等等。

    继续set,您的错误在其中爬出:
    再次,您表示该属性本身已rightNumber分配value。也就是说,在这种情况下,与上面的示例类似,您递归调用rightNumber->set:

    rightNumber = x; // вызывается rightNumber = value внутри rightNumber->set
        rightNumber = value; // снова вызывается rightNumber = value внутри rightNumber->set
            rightNumber = value; // и снова вызывается rightNumber = value внутри rightNumber->set
                rightNumber = value; // и опять вызывается rightNumber = value внутри rightNumber->set
                    ...
    

    再一次,这种情况无止境地继续下去。因为该属性仍然指代它自己。


    如何解决问题?非常简单:您需要将您的属性定义替换为

    public int rightNumber { get; private set; }
    

    或

    public int rightNumber
    {
        get
        {
            return _rightNumber;
        }
        private set
        {
            _rightNumber = value;
        }
    }
    private int _rightNumber;
    

    在第一种情况下,您将使用所谓的自动实现的属性(有条件地,第二个选项中描述的内容将自动实现并隐藏在您的眼睛之外。您可以使用反射backingField检测创建的​​)


    我希望我的回答可以帮助你,也希望你能理解你所犯的错误,不再重蹈覆辙)
    祝你好运!

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5