Property / Variable

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Property / Variable

    Hi,
    hab da mal eine allgemeine Frage (vllt. etwas peinlich, aber egal^^): was ist eigentlich der Unterschied zwischen Properties und Variablen? Also ich meine, man kann doch beiden einen Wert zuweisen oder ihn abfragen. Was wäre hier z.B. besser bzw. wie könnte man es noch besser machen:
    1. Möglichkeit:

    VB.NET-Quellcode

    1. Public Class Kontakt
    2. Private _Name As String
    3. Private _Nachname As String
    4. Public Property Name() As String
    5. Get
    6. Return _Name
    7. End Get
    8. Set(ByVal value As String)
    9. _Name = value
    10. End Set
    11. End Property
    12. Public Property Nachname() As String
    13. Get
    14. Return _Nachname
    15. End Get
    16. Set(ByVal value As String)
    17. _Nachname = value
    18. End Set
    19. End Property
    20. End Class
    21. '#####
    22. Public Class Form1
    23. Private Sub Load(...)
    24. Kontakt.Name = "abc"
    25. Kontakt.Nachname = "123"
    26. End Sub
    27. End Class
    28. 'oder so
    29. Public Class Form1
    30. Private Sub Load(...)
    31. Dim blubb As New Kontakt
    32. blubb.Name = "abc"
    33. blubb.Nachname = "123"
    34. End Sub
    35. End Class


    2. Möglichkeit:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Name As String
    3. Public Nachname As String
    4. Private Sub Load(...)
    5. Name = "abc"
    6. Nachname = "123"
    7. End Sub
    8. End Class


    Also ich versteh nicht ganz, wann man Properties benutzen soll oder ob ich diese hier in diesem Beispiel überhaupt richtig benutze...
    Wäre sehr dankbar, wenn mir das jemand erklären könnte.

    VB.NET-Quellcode

    1. Public Property Nachname() As String
    2. Get
    3. Return _Nachname
    4. End Get
    5. Private Set(ByVal value As String) ' kann überall gelesen, aber nur hier gesetzt werden.
    6. _Nachname = value
    7. End Set
    8. End Property

    VB.NET-Quellcode

    1. Public Property Nachname() As String
    2. Get
    3. Return _Nachname
    4. End Get
    5. Set(ByVal value As String)
    6. _Nachname = value
    7. ' falls noch was anderes zu tun ist, kann das hier getan werden. Z.B. in Controls eintragen
    8. End Set
    9. End Property
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie Rod schon gesagt hat, kannst du bei Properties noch neben dem Normalen setzen andere Dinge ausführen.. Du kannst zu Beispiel vor dem Setzten erst noch Prüfen ob der Zu setzende Text z.B. ein xxx enthält und dann z.B. den Text nicht setzen oder eine Exception werfen.

    Gleiches Gilt natürlich auch fürs Get :)

    lg.

    LucaWelker
    lg.

    LucaWelker
    Außerdem ist es durch ReadOnly Properties möglich auf Variablen nur lesenden Zugriff zuzulassen oder durch Default Properties standart Properties zu markieren. Dies ist zum Beispiel sehr nützlich wenn man eigene Listen baut und man direkt über die Klasseninstanz auf ein Item zugreifen kann (Instanz(0)).
    Deine Properties unterscheiden sich funktional noch nicht von einfachen Variablen.
    Aber man kann insbesondere im Setter weitere Logik unterbringen. Für Databinding etwa ist dieses Muster wichtig:

    VB.NET-Quellcode

    1. Public Class Kontakt
    2. Public Event NameChanged As EventHandler
    3. Private _Name As String
    4. Public Property Name() As String
    5. Get
    6. Return _Name
    7. End Get
    8. Set(ByVal value As String)
    9. If _Name = value then return 'keine unnützen Changed-Events werfen
    10. _Name = value
    11. RaiseEvent NameChanged(Me, EventArgs.Empty)
    12. End Set
    13. End Property
    14. End Class

    Auf diese Weise können etwa Controls automatisch davon unterrichtet werden, wenn bei einem Kontakt der Name geändert wurde.