2017-02-09 4 views
0

У меня есть простой класс, и я хочу, чтобы инициализировать его в конструкторе, как вы можете увидеть здесь:Инициализировать список класса в конструкторе возвращает исключение переполнения в C#

public class CameraSetting 
    { 

     public string CameraIP { set; get; } 
     public string CameraType { set; get; } 
     public int CameraGroup { set; get; } 
     public string GateId { set; get; } 

     public List<CameraSetting> MyList { set; get; } 
     public CameraSetting() 
     { 
      MyList = new List<CameraSetting>() 
      { 
       new CameraSetting() { CameraIP = "192", CameraGroup = 0, CameraType = "ورود",GateId = "1"}, 
       new CameraSetting() { CameraIP = "193", CameraGroup = 0, CameraType = "خروج",GateId = "1"}, 
       new CameraSetting() { CameraIP = "194", CameraGroup = 1, CameraType = "ورود",GateId = "2"}, 
       new CameraSetting() { CameraIP = "195", CameraGroup = 1, CameraType = "خروج",GateId = "2"} 

      }; 
     } 
    } 

В моем коде я называю CameraSetting obj=new CameraSetting();. но он возвращает эту ошибку:

{"Exception of type 'System.StackOverflowException' was thrown."} 

enter image description here

+2

Вы рекурсивно вызываете конструктор внутри конструктора. – juharr

ответ

1

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

  1. Вы создаете CameraSetting 1
  2. Затем CameraSettings инстанцирует 4 других CameraSettings
  3. Затем каждый из этих CameraSettings создать еще 4 CameraSettings КАЖДЫЙ! То есть, 4 * 4 = 16
  4. Повторите до бесконечности, пока среда не убивает процесс с StackOverflowException
+0

Незначительная коррекция ... каждый вызов конструктора рекурсивно вызывает тот же конструктор, пока вы не закончите пространство стека. Серия '4 * 4 * 4 * ...' не реализуется, так как каждый шаг в этом процессе будет повторяться один раз, а не возвращаться к второму. – Corey

1

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

Я думаю, что лучше взять Список из класса и определить его где-то еще по мере необходимости. Это нормально использовать. Как это в вашем главном или в некоторых других местах по мере необходимости:

static void Main(string[] args) 
{ 
    List<CameraSetting> _MyList = new List<CameraSetting>() 
    { 
     new CameraSetting() { CameraIP = "192", CameraGroup = 0, CameraType = "ورود",GateId = "1"}, 
     new CameraSetting() { CameraIP = "193", CameraGroup = 0, CameraType = "خروج",GateId = "1"}, 
     new CameraSetting() { CameraIP = "194", CameraGroup = 1, CameraType = "ورود",GateId = "2"}, 
     new CameraSetting() { CameraIP = "195", CameraGroup = 1, CameraType = "خروج",GateId = "2"} 
    }; 
    // Rest of code here 
} 
Смежные вопросы