Properties ... Fragen über Fragen ...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 79 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @Peter329

    Post #13 schrieb:

    Private Property NameList() As New List(Of String)
    From {"Hugo", "Willy", "Frank"}
    Wofür eine Private Property? Welchen Mehrwert gibt Dir diese Property?
    Bevor ich erkläre, wie man es besser lösen könnte, möchte ich, dass Du Dir Gedanken machst, was da genau passiert und warum man auf die Liste nicht von außen zugreifen kann.

    VB.NET-Quellcode

    1. Public Property Item(ByVal Index As Integer) As String
    2. Get
    3. Return _NameList(Index)
    4. End Get
    5. Set(value As String)
    6. _NameList(Index) = value
    7. End Set
    Und ich sag's nochmal:
    In Intellisense wird das Feld _Length [...] nicht angezeigt [...]. Sollte man vermeiden, wenn man nicht genau weiß, was man macht.
    Man sollte nicht von Implementierungsdetails abhängen. Wenn Du schon eine erweiterte Property verwendest, solltest Du fast immer (und auch im Zweifelsfall) auch die Property aufrufen.

    Post #19 schrieb:

    Dim _NameList As New List(Of String)

    =>

    VB.NET-Quellcode

    1. Dim _NameList As New List(Of String) From {"Hans", "Peter", "Josef"}
    Was übrigens auch nur eine Kurzform von dem ist:

    VB.NET-Quellcode

    1. Dim _NameList As List(Of String)
    2. Sub New()
    3. _NameList = New List(Of String)
    4. _NameList.Add("Hans")
    5. _NameList.Add("Peter")
    6. _NameList.Add("Josef")
    7. End Sub
    Und um's noch dazuzusagen: Nach New List(Of String) würden auch wieder leere Klammern stehen, wenn man es ganz ausschreiben würde. Also New List(Of String)().

    @Artentus
    ​Public ReadOnly NameList As New List(Of String)
    Naja, man sollte sich nicht darauf verlassen müssen, dass ein privates Feld mit dem Namen und einem Unterstrich davor angelegt wird. Denn: Wenn man was anderes zuweisen will, würde das nur über das versteckte Feld gehen. Bzw. würde so eine Property sehr eingeschränkt sein. Viel eher will man weiterhin mit internen Variablen arbeiten und nur ReadOnly nach außen zur Verfügung stellen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Viel eher will man weiterhin mit internen Variablen arbeiten und nur ReadOnly nach außen zur Verfügung stellen.
    Gerade im Fall einer Auflistung ist das zumindest bei mir der seltenste Fall, eine Readonly-Liste muss ich so gut wie nie neu instantiieren, will man sie leeren gibts ja immer noch Clear().

    Niko Ortner schrieb:

    Wofür eine Private Property?
    Wen im Setter oder Getter weiterer Code steht, diese Property jedoch nur private genutzt wird.
    @Peter329 Hier spielt Dir die VB-Syntax einen Streich (beachte die Klammern nach dem Namen):

    VB.NET-Quellcode

    1. Public ReadOnly Property NameList As List(Of String)
    2. '...
    3. End Property

    VB.NET-Quellcode

    1. Public ReadOnly Property NameList1() As List(Of String)
    2. '...
    3. End Property

    hat in VB.NET beides dieselbe Bedeutung.
    Bei einer einfachen Variablen gilt das nicht:

    VB.NET-Quellcode

    1. Public ReadOnly NameList2() As List(Of String)
    2. Public ReadOnly NameList3 As List(Of String)
    Bei NameList2() wird ein Array von List(Of String) erwartet, NameList3 ist eine schnöde List(Of String)-Variable.
    In C# ist da die Syntax präzise.
    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!
    Ich hab jetzt mal versucht, mit diesen Konstrukten sinnvoll zu arbeiten. Denn nach der Syntax kommt ja die Umsetzung der Konzepte. Ich hoffe, ihr habt Geduld mir zu folgen.

    Ich habe eine Klasse "Bookmark". Da werden ausgewählte Pfade etwa aus einem FileBrowser abgespeichert. Es gibt drei Klassenvariable: path, subdirectory und member. Das ist der ausgewählte Pfad, das ausgewählte Subdirectory und das ausgewählte Member. Zum Befüllen der Klassenvariablen wird die Prozedur SetBookmark verwendet.

    Pfad (etwa C:\Daten\Test)
    Subdirectory (etwa Programme)
    Member (etwa Picture.jpg)

    VB.NET-Quellcode

    1. Public Class Bookmark
    2. Private _path As String = ""
    3. Private _subdirectory As String = ""
    4. Private _member As String = ""
    5. Public Sub SetBookmark(bmPath As String, bmSubdirectory As String, bmMember As String)
    6. _path = bmPath
    7. _subdirectory = bmSubdirectory
    8. _member = bmMember
    9. End Sub
    10. ...



    Es gibt Properties, um z.B. den Pfad auszugeben oder um abzufragen, ob der Zugriffspfad befüllt ist:

    VB.NET-Quellcode

    1. Public ReadOnly Property BookmarkToString() As String
    2. Get
    3. Dim retval As String
    4. retval = Path.Combine(_path, _subdirectory)
    5. retval = Path.Combine(retval, _member)
    6. Return retval
    7. End Get
    8. End Property
    9. Public ReadOnly Property BookmarkIsEmpty() As Boolean
    10. Get
    11. If Path.Combine(_path, _subdirectory) = String.Empty Then
    12. Return True
    13. Else
    14. Return False
    15. End If
    16. End Get
    17. End Property


    Das funktioniert soweit auch sehr gut.

    Nun will ich verschiedene Bookmarks in einer BookmarkList speichern. Dazu definiere ich die folgende Klasse:

    VB.NET-Quellcode

    1. Public Class BookmarkList
    2. Dim _BookmarkList As New List(Of Bookmark)


    Diese Klasse hat Properties zum Hinzufügen, Löschen und Ausgeben von Bookmarks. Im Konstruktur wird die BookmarkList aus den Settings befüllt und im Closing Event wird die BookmarkList in die Settings gespeichert. Hier die Routine zum Hinzufügen von neuen Einträgen:

    VB.NET-Quellcode

    1. Public Function AddBookmark(newBookmark As Bookmark) As Integer
    2. If FindBookmark(newBookmark) Then
    3. _ErrorMessage = "*** Bookmark already present."
    4. Return vbAbort
    5. End If
    6. _BookmarkList.Add(newBookmark)
    7. _ErrorMessage = String.Empty
    8. Return vbOK
    9. End Function


    Ich hoffe, dass mein Design in Ordnung ist ...

    Hier ist nun mein Coding um einen neuen Eintrag in die BookmarkList zu speichern:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private myBookmark As New Bookmark
    3. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    4. myBookmark.SetBookmark("C:\d-daten", "Transfer", "mypicture.jpg")
    5. If vbOK = myBookmarkList.AddBookmark(myBookmark) Then MsgBox("Ok, bookmark added.")
    6. End Sub


    Was mir hieran nicht gefällt, man benötigt ZWEI Anweisungen, was daran liegt, dass SetBookmark keinen Wert zurückliefert.

    Schöner wäre es doch, wenn SetBookmark eine Function wäre, welche die gespeicherte Bookmark zurückliefert. Geht das ... ?

    VB.NET-Quellcode

    1. Public Function SetBookmark2(bmPath As String, bmSubdirectory As String, bmMember As String) As Bookmark
    2. _path = bmPath
    3. _subdirectory = bmSubdirectory
    4. _member = bmMember
    5. Return ???
    6. End Function


    Was trage ich bei "return" ein ? Ist das überhaupt sinnvoll was ich da vorhabe ?

    LG
    Peter

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    oh Mann, was hab ich denn jetzt schon wieder falsch gemacht, das den Zorn der Puristen herausfordert! Also ich sehe nur zwei Funktionen, nämlich Path.Combine und MsgBox ...

    Irgendwie ist das schon super nervig, wenn man ständig in der Gefahr lebt, irgend eine Anweisung zu kodieren die verpönt ist! Wie schon gesagt, du stellst meinen Sinn für Humor auf eine ganz harte Probe! :) Vor allem wenn nicht mal gesagt wird, woran sich denn jetzt genau der messianische Groll entzündet hat!

    Also kommt, jetzt lasst mal die Kirche im Dorf. Es wäre super nett, wenn ich eine vernünftige Antwort auf eine (wie es mir scheint) vernünftige Anfrage erhalten könnte. Ich bin nett zu euch, also seid auch nett zu mir! :)


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    Also ich verstehe deine Fragen, die übrigens sehr intelligent sind und großes Verständnis zeigen, als den Versuch von dir, aus dem Anfänger- und Dilletanten-Status herauszukommen.

    Ja was kümmern dich die syntaktischen Möglichkeiten des Property-Konstrukts, wenn du gleichzeitig noch den VisualBasic-Namespace drinne hast?
    Mit dem drinne bleibst du immer Dilletant.

    na, meinetwegen, weil ichs eh schon fertig hab:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Pth = System.IO.Path
    2. Public Class Bookmark
    3. Private _path As String = ""
    4. Private _subdirectory As String = ""
    5. Private _member As String = ""
    6. Public Sub New(bmPath As String, bmSubdirectory As String, bmMember As String)
    7. _path = bmPath
    8. _subdirectory = bmSubdirectory
    9. _member = bmMember
    10. End Sub
    11. Public ReadOnly Property Path As String
    12. Get
    13. Return _path
    14. End Get
    15. End Property
    16. Public ReadOnly Property SubDirectory As String
    17. Get
    18. Return _subdirectory
    19. End Get
    20. End Property
    21. Public ReadOnly Property Member As String
    22. Get
    23. Return _member
    24. End Get
    25. End Property
    26. Public ReadOnly Property IsEmpty As Boolean
    27. Get
    28. Return _path = "" AndAlso _subdirectory = "" AndAlso _member = ""
    29. End Get
    30. End Property
    31. Public Overrides Function ToString() As String
    32. Return Pth.Combine(Pth.Combine(_path, _subdirectory), _member)
    33. End Function
    34. End Class

    Vermeide, selbstgebastelte Auflistungs-Klassen zu coden. Die bestehenden sind ausgezeichnet.

    VB.NET-Quellcode

    1. Private _Bookmarks As New List(Of Bookmark)
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim bm = New Bookmark("P:\d-daten", "Transfer", "mypicture.jpg")
    4. If _Bookmarks.Any(Function(_bm) _bm.ToString = bm.ToString) Then
    5. MessageBox.Show("gibts schon!")
    6. Else
    7. _Bookmarks.Add(bm)
    8. End If
    9. End Sub

    Noch effizienter wäre die Überprüfung, wenn du IEquatable(Of T) implementiertest, dann könntest du statt List(Of Bookmark) Hashset(Of Bookmark) verwenden.
    Aber wie gesagt: Ist iwie frustrierend, derlei fortgeschrittenen und hocheffizienten Stoff zu erklären, wo die primitivsten Grund-Einstellungen im Argen liegen.

    Ich verstehe nicht, dass du nicht verstehst, dass der Deppen-Namespace deine Intellisense mit lauter suboptimalem Zeug vollmüllt, an OOP-Prinzipien vorbei und meist auch technisch minderwertig.
    Der Namespace ist einfach der Ausweis für Vb.net-Dilletanten, da werden sich immer Leute dran stoßen, wenn sie dessen Ausflüsse in deim Code zu sehen kriegen.
    Und deshalb empfehle ich in Zukunft wirklich nur noch c#, weil scheinbar ists für jeden Einsteiger sowas von schwer zu begreifen - so schlau sie sich ansonsten auch anstellen mögen.
    Weil in c# gibts den Quatsch einfach garnet - hingegen in vb muss man erstmal was dafür tun (ein einziges mal!), um ihn sich vom Hals zu schaffen.

    Also konkret der DilletantenCode ist dieser hier:

    VB.NET-Quellcode

    1. If vbOK = myBookmarkList.AddBookmark(myBookmark) Then MsgBox("Ok, bookmark added.")

    Das wäre ausgeschrieben so:

    VB.NET-Quellcode

    1. If Microsoft.VisualBasic.vbOK = myBookmarkList.AddBookmark(myBookmark) Then Microsoft.VisualBasic.MsgBox("Ok, bookmark added.")
    Und da wird unnötigerweise ein Enum mit einem Integer verglichen.
    Besser wäre, die Add-Methode würde einfach einen Boolean zurückgeben, wie es etwa Hashset.Add() tut (aber der Design-Fehler rührt garnet vom Deppen-Namespace. Oder aber vlt. doch - vlt. wärste ohne das vbOk drauf gekommen, deine AddBookmark() bool returnen zu lassen).

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ja was kümmern dich die syntaktischen Möglichkeiten des Property-Konstrukts, wenn du gleichzeitig noch den VisualBasic-Namespace drinne hast?


    Na, das trifft mich jetzt aber in Mark und Bein. Zumal ich auch nach langem Nachdenken KEINE Ahnung habe, welchen Frevel ich da begangen haben könnte. Namespace? Hab ich da was kodiert? Um Gottes Willen!

    Aber wie gesagt: Ist iwie frustrierend, derlei fortgeschrittenen und hocheffizienten Stoff zu erklären, wo die primitivsten Grund-Einstellungen im Argen liegen.


    Neeee, deinen Frust kann ich schon gut nachvollziehen, wenn es mir so sehr an den primitivsten Grundeinstellungen fehlt, dass ich nicht mal erkennen kann WAS mir überhaupt fehlt. Es steht schon wirklich sehr schlimm um mich! Aber vielleicht bist du doch so unendlich freundlich, mir meine Verfehlungen so nachsichtig zu erklären, dass sogar ICH das noch verstehe.

    Danke!

    LG
    Peter
    das hab ich doch verlinkt - post#25 .
    Ist das nicht verständlich, was da steht?

    Einfach mal machen, was da steht.
    Dann tauchen viele Fehler auf, wo du den Microsoft.Visualbasic - Schrott durch Sachen aussm System - Namespace ersetzen kannst.
    Dabei wird glaub auch das Namespace-Konzept bischen klarer.

    Prinzipiell geniesse ich es ja als Vorzug von VB, dass man da projektweite General-Importe setzen kann - in c# muss man immer erstmal 5 Zeilen Imports-Anweisungen (c#: using) hinmachen.
    Aber auch das ist vlt. für Anfänger besser, weil die können nicht einfach los-coden, ohne von Namespaces ühaupt was gehört zu haben.
    das hab ich doch verlinkt - post#25 .
    Ist das nicht verständlich, was da steht?


    Nö! Ich habe KEINE Ahnung was ich da verstehen sollte.

    In "böse Funktionen" wird dargelegt, wie man bestimmte outdated Functions ablösen sollte. Das meine ich zu beherzigen.

    Also auch beim besten Willen finde ich in meinem Coding nix, was da jetzt in dieser Hinsicht zu beanstanden sein sollte!

    Warum ich das Namespace Konzept nicht verstanden haben sollte, kann ich auch nicht nachvollziehen.

    Ich gebe allerdings eins unumwunden zu: ich bin kein Hellseher. Und deswegen wäre es wirklich nett, wenn du jetzt endlich mal sagst, was SACHE ist.

    Lass uns das Palaver dahingehend abkürzen, indem du einfach klipp und klar sagst, was deiner Meinung nach in meinem Coding so grundlegen falsch ist! Ganz einfach: Coding + Verstoß! Sollte ja nicht so schwer sein.

    Und dann verstehe ich das auch. :)
    Das Problem ist nicht das Coding, sondern die Projekt-Einstellung.
    Und im verlinkten Tut hab ich ein Bildle, was zeigt, wo inne Projekteinstellungen die General-Importe zugefügt oder entfernt werden können.
    Und was ich dir empfehle zu tun, ist, den General-Import von Micorsoft.VisualBasic zu entfernen.
    Da ist nur eine Checkbox zu unchecken und alles wird gut.
    Und die Coding-Errors meldet dir dann der Compiler.

    Mir scheint übrigens, du hast iwie das falsche Tut am Wickel, denn meins beschäftigt sich nicht mit den outdateten Functions im einzelnen.
    Nur die Split-Funktion ist als Beispiel herangezogen, um aufzuzeigen, wie leicht man durch den Deppen-Namespace aufs Neben-Gleis gerät.

    Peter329 schrieb:

    Was trage ich bei "return" ein ? Ist das überhaupt sinnvoll was ich da vorhabe ?
    Sieh Dir mal das an, Konstruktor und Aufruf des Konstruktors:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. End Sub
    4. Public Function SetBookmark2(bmPath As String, bmSubdirectory As String, bmMember As String) As Bookmark
    5. Return New Bookmark(bmPath, bmSubdirectory, bmMember)
    6. End Function
    7. End Class

    VB.NET-Quellcode

    1. Public Class Bookmark
    2. Private _path As String = ""
    3. Private _subdirectory As String = ""
    4. Private _member As String = ""
    5. Public Sub New(bmPath As String, bmSubdirectory As String, bmMember As String)
    6. _path = bmPath
    7. _subdirectory = bmSubdirectory
    8. _member = bmMember
    9. End Sub
    10. End Class
    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!

    Gonger96 schrieb:

    Guck dir mal Post 27 an, dasteht ganz groß wo der Mist begraben liegt.


    Na, der Beitrag 27 ist ja (derzeitiger Stand) 10 mal editiert worden. Die Sache mit dem "vbOK" die gab es noch nicht, als ich darauf geantwortet habe. Und wie schon gesagt, ich bin KEIN "Clairvoyant". Entgegen möglicherweise anderslautender Meinungen. :)

    Also, weil ich vbOK verwendet habe, eine Enumeration aus dem Namespace Microsoft.VisualBasic, habe ich mir den Vorwurf eingehandelt, erstens "böse Funktionen" zu verwenden und zweitens nix von Namespaces zu verstehen. Dass "vbOK" nicht mehr geduldet wird, hätte mir EDR eigentlich auch einfach klipp und klar sagen können, ohne so einen riesen Terz zu veranstalten! Nebenbei bemerkt, die Enumeration vbOK wird in tausenden von Sample Codes verwendet, ebenso wie MsgBox. Na, dass diese Dinge hier im Forum absolute "nogos" sind, das sollte man wissen, ehe man seinen Code leichtfertig postet. Ein bissl doktrinär kommt das bei mir aber schon an, wenn man mir diese Unbotmäßigkeit mal nachsieht!

    Und noch etwas: eine Boolean Variable reicht mir als Return Code oft nicht aus. vbOK = erfolgreich, vbAbort = Funktion gescheitert, vbCancel = Abbruch durch den User, etc. etc.

    Dann werde ich halt den Namespace Microsoft.VisualBasic in drei Teufels Namen rausnehmen und eine eigene Enumeration anlegen. Darf ich die dann wenigstens in der Abfrage verwenden? Oder ist das auch verboten? Na gut ... jetzt weiß ich wenigstens endlich was SACHE an diesem Theater ist.

    Zurück zum Thema:

    Danke für den "Redesign" von EDR ... die Sache mit SetBookmark wird also in den Konstruktor verlegt. Und einige Funktionen, wie etwa BookmarkIsEmpty kann man durch Standard Funktionen ersetzen. Das habe ich verstanden und mache es auch so.

    Ebenfalls Dank an RFG. Dass man in diesem Fall einfach im Return mit "New" eine neue Instanz von Bookmark anlegt ist natürlich eine tolle Sache. Na, wenn man es dann sieht, ist es eigentlich recht naheliegend. Aber dass dieser rekursive Aufruf klappt, das ist natürlich erst mal nicht selbstverständlich.

    Ich habe eine Menge gelernt. Vielen Dank nochmal an die Ratgeber und einen schönen Abend!

    LG
    Peter

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Und noch etwas: eine Boolean Variable reicht mir als Return Code oft nicht aus. vbOK = erfolgreich, vbAbort = Funktion gescheitert, vbCancel = Abbruch durch den User, etc. etc.
    derzeit returnst du entweder vbOk oder vbAbort, und bei Abort wird nicht geadded.
    Da könntest du einfacher True/False returnen, ob geadded wurde oder nicht.
    Zumindest in dieser Anforderung brauchste keine Extra-Enumeration für anlegen.

    Btw: Kann ich dich noch für Hashset(of T) interessieren?
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Pth = System.IO.Path
    2. Public Class Bookmark : Implements IEquatable(Of Bookmark)
    3. Private _path As String = ""
    4. Private _subdirectory As String = ""
    5. Private _member As String = ""
    6. Public Sub New(bmPath As String, bmSubdirectory As String, bmMember As String)
    7. _path = bmPath
    8. _subdirectory = bmSubdirectory
    9. _member = bmMember
    10. End Sub
    11. Public ReadOnly Property Path As String
    12. Get
    13. Return _path
    14. End Get
    15. End Property
    16. Public ReadOnly Property SubDirectory As String
    17. Get
    18. Return _subdirectory
    19. End Get
    20. End Property
    21. Public ReadOnly Property Member As String
    22. Get
    23. Return _member
    24. End Get
    25. End Property
    26. Public ReadOnly Property IsEmpty As Boolean
    27. Get
    28. Return _path = "" AndAlso _subdirectory = "" AndAlso _member = ""
    29. End Get
    30. End Property
    31. Public Overrides Function ToString() As String
    32. Return Pth.Combine(Pth.Combine(_path, _subdirectory), _member)
    33. End Function
    34. Public Overrides Function Equals(obj As Object) As Boolean
    35. Return Equals(DirectCast(obj, Bookmark))
    36. End Function
    37. Public Overloads Function Equals(other As Bookmark) As Boolean Implements IEquatable(Of Bookmark).Equals
    38. If other Is Nothing Then Return False
    39. Return ToString.Equals(other.ToString)
    40. End Function
    41. Public Overrides Function GetHashCode() As Integer
    42. Return ToString.GetHashCode()
    43. End Function
    44. End Class

    VB.NET-Quellcode

    1. Private _hshBookmarks As New HashSet(Of Bookmark)
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim bm = New Bookmark("P:\d-daten", "Transfer", "mypicture.jpg")
    4. If Not _hshBookmarks.Add(bm) Then MessageBox.Show("gibts schon!")
    5. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Peter329 schrieb:

    Und noch etwas: eine Boolean Variable reicht mir als Return Code oft nicht aus. vbOK = erfolgreich, vbAbort = Funktion gescheitert, vbCancel = Abbruch durch den User, etc. etc.
    Das ist eine C-Typische Denkweise, vor allem wenn ich mir dann noch den globalen ErrorString dazu anscheue ergibt sich da ja ein System wie in der Win32-API mit HResult und GetLastError. Das ist aber Quatsch in VB, es wurden ja nicht umsonst Exceptions erfunden. Bei nem Error einfach ne Exception schmeißen mit dem zugehörigen Beschreibungstext, dann hilft dir sogar VisualStudio.

    Peter329 schrieb:

    Und noch etwas: eine Boolean Variable reicht mir als Return Code oft nicht aus. vbOK = erfolgreich, vbAbort = Funktion gescheitert, vbCancel = Abbruch durch den User, etc. etc.

    Man gibt auch keinen bool zurück (es sei denn man hätte eine Try...-Funktion), wir sind nicht in C. Eine Funktion muss einen Sinnvollen Return-Wert haben, wenn dem nicht so ist solltest du n Sub nehmen. Falls irgendetwas scheitert, Exception werfen.

    Edit:
    Das geht einem echt auf den Geist, dass man nicht benachrichtigt wird, wenn Andere vor einem antworten. Kann man das irgendwo in den Einstellungen aktivieren?

    Gonger96 schrieb:

    Man gibt auch keinen bool zurück
    doch, bei Add-Methoden ist das nicht unüblich.
    Mir fällt zwar grad nur Hashset ein, aber gibt noch andere Fälle.

    Ah - zB. Control.Focus() returnt False, wenn das Control nicht fokussiert wern konnte.
    GridItem.Select() - und alle GridItem-Erben...
    IEnumrator(Of T).MoveNext()
    ...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Okie, da haben wir ja gleich ein weiteres Thema, das ich ohnehin diskutieren wollte: die Fehlerbehandlung in Properties.

    derzeit returnst du entweder vbOk oder vbAbort, und bei Abort wird nicht geadded.


    Jau, derzeit ... aber das ist auch noch nicht das endgültige Coding.

    Und im übrigen habe ich es gerne, wenn alle meine Funktionen das gleiche Verhaltensmuster aufweisen. Dann muss ich mir nämlich weniger merken. :)

    Das ist eine C-Typische Denkweise, vor allem wenn ich mir dann noch den globalen ErrorString dazu anscheue ergibt sich da ja ein System wie in der Win32-API mit HResult und GetLastError. Das ist aber Quatsch in VB, es wurden ja nicht umsonst Exceptions erfunden.


    Also die ErrorMessage ist in meinem Coding KEINE globale Variable, sondern eine Property der Klasse.

    Klar, könnte ich auch eine Exception werfen ... dann muss ich aber jeden Aufruf der Funktion in einen Try - Catch Block einrahmen ... und das macht die Programmlogik m.E. unhandlich. Denn im Fehlerfall will ich ja eventuell bestimmte Programmteile ausführen bzw. nicht ausführen.

    Btw: Kann ich dich noch für Hashset(of T) interessieren?


    Klar kannst du mich dafür interessieren ... kommt darauf an, ob du mir das auch verständlich präsentierst. :)