Darshan E Ksheerasagar Ответов: 2

Ошибка стека над потоком ошибка


----- Колонна 1----- -----Колонка 2-----
__________________________________________
| Пересаживать | Название Строки 1
|Имя: Раджеш | Фамилия: Патил / Строка 2
/ Дата:15.07.1947 / Пол: Мужской / Строка 3


Как я показал выше изображение . я хочу динамически проектировать таблицу по мере необходимости пользователя.
Теперь возьмем пример приведенной выше таблицы 2 column table .

Для столбца записывается класс Как Columns. cs, как показано ниже
public class Columns
    {
        public List<Columns> rCol { set; get; }
        Columns mCurrentColumn1;
        public Columns()
        {
            rCol = new List<Columns>();
        }
       
        public string   ColName       { set; get; }
        public string   Value         { set; get; }
        
        public Columns AddColumn(string ColName, String Value)
        {
            mCurrentColumn1 = new Columns();
            mCurrentColumn1.ColName = ColName;
            mCurrentColumn1.Value = Value;
            rCol.Add(mCurrentColumn1);

            return mCurrentColumn1;
        }
    }
	
For AddColumn is written Class as AddColumn.cs as below
	
public class AddColumn
    {
        public List<AddColumn> rCol1 { set; get; }
        AddColumn mCurrentColumn2;

        public AddColumn()
        {
            rCol1 = new List<AddColumn>();
        }
        public void AddCol(Columns AddCol)
        {
            mCurrentColumn2 = new AddColumn();
            mCurrentColumn2.AddCol(AddCol);
            rCol1.Add(mCurrentColumn2);
        }
    }	
	
For AddRow is written Class as AddRow.cs as below
	
public class AddRow
    {
        public List<AddRow> rCol2 { set; get; }
        AddRow mCurrentColumn3;

        public AddRow()
        {
            rCol2 = new List<AddRow>();
        }

        public void AddColumn(AddColumn AddCol)
        {
            mCurrentColumn3 = new AddRow();
            mCurrentColumn3.AddColumn(AddCol);
            rCol2.Add(mCurrentColumn3);
        }
    }	
	
	

public partial class Default : System.Web.UI.Page
{
	Columns Col = new Columns();
	AddColumn ACol = new AddColumn();
	AddRow ARow = new AddRow();	
	protected void Page_Load(object sender, EventArgs e)
	{
		Col.AddColumn("MainHeader1", "State Bank of India");
		Col.AddColumn("MainHeader2", "State Bank of India");
		Col.AddColumn("MainHeader3", "State Bank of India");

		ACol.AddCol(Col);
		ARow.AddColumn(ACol);
	}	
}


Когда я запускаю программу в классе AddRow.cs, показывающую ошибку как
- Необработанное исключение типа "система".StackOverflowException ' произошло в"

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

public partial class Default : System.Web.UI.Page
{
	Columns Col = new Columns();
	AddColumn ACol = new AddColumn();
	AddRow ARow = new AddRow();	
	protected void Page_Load(object sender, EventArgs e)
	{
		Col.AddColumn("MainHeader1", "State Bank of India");
		Col.AddColumn("MainHeader2", "State Bank of India");
		Col.AddColumn("MainHeader3", "State Bank of India");

		ACol.AddCol(Col);
		ARow.AddColumn(ACol);
	}	
}

F-ES Sitecore

Вы получаете исключение переполнения стека, когда ваш код входит в бесконечный цикл, например

void SomeFunction()
{
SomeFunction();
}

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

2 Ответов

Рейтинг:
5

Midi_Mick

У вас есть 2 места, где это произойдет. В вашем столбце AddColumn.Метод AddCol и ваш AddRow.Метод AddColumn - и то и другое по одной и той же причине. Давайте просто посмотрим на AddColumn.Метод AddCol:

public void AddCol(Columns AddCol)
{
    mCurrentColumn2 = new AddColumn();
    mCurrentColumn2.AddCol(AddCol);
    rCol1.Add(mCurrentColumn2);
}


Первая строка создает новый AddColumn.
2-я строка затем вызывает AddCol, который затем
   Первая строка создает новый столбец AddColumn
   2-я строка затем вызывает AddCol, который затем
      Первая строка создает новый столбец AddColumn

и так далее-до тех пор, пока стек не заполнится слишком большим количеством вызовов и не будет сгенерирована ошибка. Этот Метод Addrow.Метод AddColumn делает точно то же самое.


Рейтинг:
0

Jochen Arndt

Этот класс является рекурсивным:

public class AddRow
{
    public List<AddRow> rCol2 { set; get; }
    AddRow mCurrentColumn3;
    
    public AddRow()
    {
        rCol2 = new List<AddRow>();
    }
    
    public void AddColumn(AddColumn AddCol)
    {
        mCurrentColumn3 = new AddRow();
        mCurrentColumn3.AddColumn(AddCol);
        rCol2.Add(mCurrentColumn3);
    }
}

Класс имеет переменную-член типа class (mCurrentColumn3Это не будет работать, когда класс имеет конструктор (начальный конструктор вызывает конструктор члена, который вызывает конструкторы членов и так далее).

Когда конструктора нет или он ничего не делает, ошибка возникает путем вызова mCurrentColumn3.AddColumn() в AddColumn() функция, которая снова вызывает саму функцию.

Оба будут продолжаться бесконечно, но остановятся, когда стек переполнится.

Решение: переосмыслите свой дизайн класса.