【问题标题】:An unhandled exception of type 'System.StackOverflowException' occurred in SchoolManagementSystemOOP.dll ?SchoolManagementSystemOOP.dll 中发生了“System.StackOverflowException”类型的未处理异常?
【发布时间】:2017-09-21 14:15:24
【问题描述】:

我有一个类 DBConnectionClass 和一些相关的类。 我有一个 InsertQueryMethod 如下

      public string InsertQuery
    {
        get { return InsertQuery; }
        set { InsertQuery = schools.SchoolsInsertQuery +                         branches.BranchInsertQuery + students.StudentsInsertQuery ; }
    }

类中的关联查询是:

     public string StudentsInsertQuery  = " INSERT INTO AddStudents (FirstName, LastName, PhoneNo, EmailId) VALUES (@FirstName, @LastName, @PhoneNo, @EmailId) ";
    public string StudentsUpdateQuery  = " UPDATE AddStudents SET(FirstName=@FirstName, LastName=@LastName, PhoneNo=@PhoneNo, EmailId=@EmailId) ";
    public string StudentsDeleteQuery  = " DELETE FROM AddStudents ";
    public string StudentsSelectQuery  = " SELECT * FROM AddStudents WHERE Id=@ID ";

类似的情况是分支和学校类。 我收到此错误:

在 SchoolManagementSystemOOP.dll 中发生了“System.StackOverflowException”类型的未处理异常。在 DBConnectionClass 中获取 {return InsertQuery;}。我的项目中有这个错误。请告诉我正在发生的事情以及如何处理此异常。

【问题讨论】:

  • 我立即看到堆栈溢出。您的二传手将导致相同的异常。你知道什么是堆栈溢出,以及属性 get/set 是如何工作的吗?
  • 您使用的属性错误。查找有关 get/set 的一些基本信息以开始使用 :)
  • 对不起,你的setter原样不会造成溢出,但是完全错了……

标签: c# sql visual-studio


【解决方案1】:

这是无限递归的,会导致栈溢出:

public int MyInt {
    get { return MyInt; }
}

return MyInt; 再次为MyInt 调用get 访问器,它尝试调用return MyInt;,它调用get 访问器...直到堆栈已满。

您没有为变量指定任何实际存储。如果您在 get/set 中不需要任何特殊行为,C# 为您提供了一个可爱的捷径:

public int MyInt {
    get;
    set;
}

C# 将在后台为属性创建存储。如果需要特殊行为,则必须声明自己的存储。例如:

private int m_my_int;
public int MyInt {
    get {
        // maybe do something
        return m_my_int;
    }
    set {
        // maybe do something
        m_my_int = value;
    }
}

【讨论】:

  • 你的代码有问题。具体来说,c#没有property关键字!
  • 啊,你是对的。我在 C++/CLI 领域花费了太多时间。编辑修复。
  • 使用上述方法消除了错误。但是在我设置对象 Schoolsschools =new Schools(); 的那一行也会出现同样的错误。我知道这种方法不是完全错误的,它必须以某种方式工作。你能给我一个见解@Brian A. Henning
  • @MuhammadShahid 在我看来你会从更多的 C# 学习中受益。花更多时间尝试自己理解它,然后返回 Stack Overflow 并在再次遇到困难时提出其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多