Search code examples
vb.netstack-overflow

Login Screen: Stack overflow exception


I am studying VB.NET so I want to make a simple login screen. For now, I only want that if I click on the button it writes something to the console ( I still dont know where that output is going ) but I get a stack overflow exception as soon as I click in Run.

Can someone advice me in why this code does not work?

Public Class Form1

Private Class Users


    Public Property Name() As String
        Get
            ' Gets the property value.
            Return Name
        End Get
        Set(ByVal Value As String)
            ' Sets the property value.
            Name = Value
        End Set
    End Property

    Public Property Password() As String
        Get
            ' Gets the property value.
            Return Password
        End Get
        Set(ByVal Value As String)
            ' Sets the property value.
            Password = Value
        End Set
    End Property

    Public Sub New(ByVal name As String, ByVal password As String)
        Me.Name = name
        Me.Password = password
    End Sub



End Class

Private user As New Users("Matias", "Barrios")



Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click

End Sub

Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click

End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load


End Sub

Public Sub Validar(nombre As String, password As String)
    Me.TextBox1.Text = user.Name
    If nombre = user.Name And password = user.Password Then
        System.Console.Write(user.Name)
        Me.TextBox1.Text = "No"


    End If

End Sub

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Validar("Matias", "Barrios")
    System.Console.Write("Click!")
End Sub
End Class

Solution

  • You have this:

    Public Property Name() As String
        Get
            ' Gets the property value.
            Return Name
        End Get
        Set(ByVal Value As String)
            ' Sets the property value.
            Name = Value
        End Set
    End Property
    

    The Get for that property refers to itself. So Get calls Get, which calls Get again, and so on, forever, until you run out of stack space for the function calls. Set does the same thing.

    To fix the problem, the property is simple enough to use the auto-implement shorthand:

    Public Property Name As String
    

    But if you want to do it the long way, you need a backing field with a different name:

    Private _Name As String
    Public Property Name() As String
        Get
            ' Gets the property value.
            Return _Name
        End Get
        Set(ByVal Value As String)
            ' Sets the property value.
            _Name = Value
        End Set
    End Property
    

    Whichever you choose, you'll need to make the same change for the Password property.