satyanand mishra Ответов: 4

Я устал решать проблему stackoverflow


interface IEmployee
   {
       string this[int Id]
       {
           get;
           set;
       }



   }


   class Employee
   {
       int EmpId { get; set; }
       string Name { get; set; }
       string Gender { get; set; }
       private  List<Employee> listemp;
       public Employee()
       {
           listemp = new List<Employee>()
           {

               new Employee(){EmpId=101,Name="Sarita",Gender="Male"},
               new Employee(){EmpId=102,Name="Lalita",Gender="Female"}
           };



       }





       public string this[int Id]
       {
           get { return listemp.FirstOrDefault(x => x.EmpId == Id).Name; }
           set { listemp.FirstOrDefault(x => x.EmpId == Id).Name = value; }
       }


   }


   class Program
   {
       static void Main(string[] args)
       {

           Employee emp=new Employee();
           Console.WriteLine("Name is {0}", emp[101]);
           Console.WriteLine("Name is {0}", emp[102]);
           Console.ReadKey();

       }
   }


Что я уже пробовал:

всякий раз, когда я запускаю это give exception stack overflow, то как мне решить эту проблему

4 Ответов

Рейтинг:
30

Richard Deeming

Цитата:
public Employee()
{
    listemp = new List<Employee>()
    {
        new Employee(){EmpId=101,Name="Sarita",Gender="Male"},
        new Employee(){EmpId=102,Name="Lalita",Gender="Female"}
    };
}
Должно быть довольно очевидно, в чем заключается проблема: вы создаете новый экземпляр Employee класс, который пытается создать два экземпляра Employee класс, каждый из которых пытается создать два экземпляра Employee класс, каждый из которых...

У вас есть бесконечная рекурсия в вашем коде. Вам нужно будет удалить это.


Рейтинг:
25

phil.o

Посмотрите, что происходит, когда вы вызываете конструктор:
- listemp инициализируется новым списком сотрудников для первоначального сотрудника
- первый элемент дается в список, вызывая конструктор снова
- listemp инициализируется новым списком сотрудников для первого пункта listemp
- прием...

Вы сталкиваетесь с этой проблемой, потому что вы вызываете Employee конструктор изнутри себя. Программа постоянно создает новые списки сотрудников и пытается воздействовать на них новыми сотрудниками.

Вместо этого вы, вероятно, хотите просто создать новый список, не заполняя его (так что это не так null). Позже, при инициализации, вы можете заполнить emplist с соответствующими сотрудниками.

Поместите точку останова в свой конструктор, нажмите клавишу F5 и отладьте оттуда. Вы будете ясно видеть, что происходит.


Рейтинг:
2

Patrice T

Цитата:
всякий раз, когда я запускаю это give exception stack overflow, то как мне решить эту проблему

Используйте отладчик, чтобы увидеть, что происходит в вашем коде.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
1

Phil J Pearson

Конструктор Employee вызывает сам себя!