VB.NET登录界面运行触发Stack overflow exception问题求助
问题排查与解决方案
嘿,我一眼就发现你踩了一个VB.NET新手常犯的小坑,直接导致了Stack Overflow Exception!咱们一步步拆解问题、解决问题:
1. 栈溢出的根本原因:属性无限递归
你写的Users类里的Name属性犯了一个关键错误——在Get/Set方法里直接访问属性本身,而非私有字段,这会触发无限递归调用:
Public Property Name() As String
Get
' 这里的Name是属性本身,调用Get会再次触发Get方法,无限循环
Return Name
End Get
Set(ByVal Value As String)
' 同理,给Name赋值会再次触发Set方法,无限循环
Name = Value
End Set
End Property
每次访问这个属性,都会反复调用自己的Get/Set逻辑,栈空间被不断消耗,最终抛出栈溢出异常。
2. 修正后的代码
我们需要给属性搭配一个对应的私有字段,让Get/Set方法操作这个字段,而不是属性本身:
Public Class Form1 ' 修正后的Users类:添加私有字段存储属性值 Private Class Users ' 私有字段,用于实际存储Name的值 Private _name As String Public Property Name() As String Get ' 返回私有字段的值,而非属性本身 Return _name End Get Set(ByVal Value As String) ' 给私有字段赋值,而非属性本身 _name = Value End Set End Property End Class ' 示例按钮点击事件:测试输出 Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click ' 测试创建用户并输出 Dim testUser As New Users() testUser.Name = "测试用户" ' 控制台输出(后面会说怎么看到这个输出) Console.WriteLine($"用户名称:{testUser.Name}") ' 或者用弹窗显示,更直观 MessageBox.Show($"用户名称:{testUser.Name}", "登录测试") End Sub End Class
3. 关于控制台输出的显示问题
在WinForms项目里,默认运行时不会弹出控制台窗口,所以你看不到Console.WriteLine的输出。有两种解决方式:
- 方式一:修改项目属性
右键你的项目 → 属性 → 应用程序 → 输出类型,选择“控制台应用程序”,这样运行时会同时弹出WinForms窗口和控制台窗口,就能看到输出了。 - 方式二:用弹窗替代控制台输出
直接用MessageBox.Show()方法(如上面代码示例),测试登录逻辑时更直观,不需要额外设置。
内容的提问来源于stack exchange,提问作者Matias Barrios
相关产品推荐
相关产品推荐

