«Процесс завершается из-за StackOverflowException», причина для этого в следующем коде - PullRequest
0 голосов
/ 24 февраля 2020

Класс, который сам по себе содержит свой экземпляр объекта, при создании объекта этого класса в методе main в c# он дает stackoverflowExeption. Почему?? Я хочу причину, а не решение. Спасибо

namespace project_1
{
class check
{
    check checkobject = new check();// Line-1

    /*I have not access Line-1 in main method.
     But due to Line-1 or Line-2, output says "Process is terminating due to StackOverflowException". Why??
     I do not need the solution, I want to know the reason for it.
     Removing " new check() " from Line-1, then it works fine.
     */
    public void Display() {
        Console.WriteLine("It worked");
    }
}
class DemoProgram
{
    static void Main(string[] args)
    {
        check ob1 = new check();// Line-2
        ob1.Display();
    }
}
}

Ответы [ 4 ]

3 голосов
/ 24 февраля 2020

Это потому, что когда вы создаете новый объект проверки из основного метода, он запускает инициализацию переменной экземпляра checkobject, которая снова создает объект проверки класса. Это бесконечная процедура, поэтому память, выделенная вашей программе, исчерпана.

2 голосов
/ 24 февраля 2020

Если вы попытаетесь отладить вашей программы, вы увидите вывод, подобный следующему. Если вы почти ничего не знаете, почему это происходит, по крайней мере, вы можете догадаться, что что-то не так в зависимости от конструктора.

Compilation succeeded - 1 warning(s)

jdoodle.cs(5,11): warning CS0414: The private field `check.checkobject' is assigned 
                  but its value is never used


Stack overflow: IP: 0x5647646e1705, fault addr: 0x7fffc422eff8
Stacktrace:
  at <unknown> <0xffffffff>
  at (wrapper alloc) object.AllocSmall (intptr,intptr) <0x00103>
  <...>
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0
  ........
  ........
  ........
  ........
  ........
  at check..ctor () [0x00000] in <db1fd2bd96e041fab014c4ec28898e03>:0

  output Limit reached.
2 голосов
/ 24 февраля 2020

Вы вызываете свой конструктор класса каждый раз, когда класс инициализируется. Строка, помеченная как строка 1, - это та, которую вы не должны иметь. Это означает, что вы вызываете свой конструктор рекурсивно.

1 голос
/ 24 февраля 2020

Ваша проблема - бесконечная рекурсия , вызванная инициализатором поля .

Пример

public class Test
{
   Type FieldName = SomeValue;

A инициализатор поля выполняется перед телами конструктора. Здесь важно отметить, что они выполняются всегда .

Это означает, что вы не можете сделать это, он запускается, когда class инициализируется.

check checkobject = new check();

Каждый раз, когда вы new up (инициализировать) этот класс , он будет запускать приведенный выше код, который по своей природе new создает другие экземпляры самого себя из-за инициализаторов * field, которые, в свою очередь, запускают вышеописанное снова так далее и так далее , пока у вас не кончится стек .

Если вы действительно хотите самоссылающееся свойство , например это, и вы хотите, чтобы это было инициализировано (в автоматическом смысле c), используйте ленивую технику загрузки, например.

private Check _checkObject;

public Check CheckObject => _checkObject?? (_checkObject = new Check());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...