2017-02-08 7 views
0

Я хочу присвоить список переменной-члену (переменная является списком), но всегда появляется сообщение об ошибке: System.StackOverflowException был необработанным, я не знаю, почему, пожалуйста, см. мой код ниже:Присвоить значение переменной-члену не удалось, возникло событие StackOverflowException

public class Employee 
{ 
    public int EmployeeID { get; set; } 
    public string EmployeeName { get; set; } 
    public int DeptID { get; set; } 
} 

public class Department 
{ 
    public int DeptID { get; set; } 
    public string DeptName { get; set; } 
    public List<Employee> Employees 
    { 
     set { Employees = value; } 
     //get { return EmployeeDataAccessLayer.getEmployeesByDeptID(DeptID); } 
     get { return Employees; } 
    } 
} 
public class EmployeeDataAccessLayer 
{ 
    public static List<Employee> getEmployeesByDeptID(int deptID) 
    { 
     string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     string sqlStr = "select * from tblemployee where deptid = :deptid order by employeeid asc"; 
     List<Employee> employees = new List<Employee>(); 
     using (OracleConnection ocon = new OracleConnection(conStr)) 
     { 
      OracleCommand ocmd = new OracleCommand(sqlStr, ocon); 
      ocmd.Parameters.Add(":deptid", deptID); 
      ocmd.Connection.Open(); 
      OracleDataReader rdr = ocmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       Employee employee = new Employee(); 
       employee.EmployeeID = Convert.ToInt32(rdr["EMPLOYEEID"]); 
       employee.EmployeeName = rdr["NAME"].ToString(); 
       employee.DeptID = Convert.ToInt32(rdr["DEPTID"]); 
       employees.Add(employee); 
      } 
     } 
     return employees; 
    } 
} 

public class DepartmentDataAccessLayer 
{ 

    public static List<Department> getAllDepartments() 
    { 
     string conStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
     string sqlStr = "select * from tbldepartment order by departmentid asc"; 
     List<Department> depts = new List<Department>(); 

     using (OracleConnection ocon = new OracleConnection(conStr)) 
     { 
      OracleCommand ocmd = new OracleCommand(sqlStr, ocon); 
      ocmd.Connection.Open(); 
      OracleDataReader rdr = ocmd.ExecuteReader(); 
      while (rdr.Read()) 
      { 
       Department dept = new Department(); 
       dept.DeptID = Convert.ToInt32(rdr["DEPARTMENTID"]); 
       dept.DeptName = rdr["NAME"].ToString(); 
       dept.Employees = EmployeeDataAccessLayer.getEmployeesByDeptID(dept.DeptID); 
       depts.Add(dept); 
      } 
     } 

     return depts; 
    } 
} 

так, отладить его и обнаружил, что исключение произошло в:

set { Employees = value;}  

смотри ниже скриншоте:

enter image description here

Я действительно не знаю, почему, можете ли вы рассказать мне причину или дать мне несколько предложений?

ответ

1

Поскольку вы устанавливаете Employees в value ставящая Employees к value ставящая Employees к value, который настройка ....... и т. д. до переполнения стека.

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

public List<Employee> Employees { get; set; } 

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

private List<Employee> _employees; 
public List<Employee> Employees 
{ 
    set { _employees = value; } 
    get { return _employees; } 
} 
1

Если вы устанавливаете значение в C# с получения и установки, все, что вам нужно сделать, это

public List<Employee> Employees{get; set;} 

С пустым получить и установить блок, то значение будет присвоено автоматически. В коде, вы, по сути, вызывая функцию набора для переменной снова и снова, пока исключение StackOverflow не происходит

Более подробную информацию о свойствах here

2

В вашем случае, когда вы назначаете что-то к Employees это сеттер вызовет повторную привязку к той же переменной, чтобы тот же процесс продолжался, и это приводит к бесконечным назначению, поэтому вы получаете это исключение. Чтобы преодолеть это изменить определение собственности как это:

private List<Employee> _Employees 
public List<Employee> Employees 
{ 
    set { _Employees = value; }  
    get { return _Employees; } 
} 

или вроде этого:

public List<Employee> Employees { get; set; }