Abbruch von New

Rene42

Erfahrenes Mitglied
Hallo,

ich arbeite mit Visual Basic Express. Zum Beispiel erzeuge ich eine Instanz einer Klasse mit folgendem Code:

Test=New("Falsches Format")

Sub New(Neue_ID as int32)

ID=Neue_ID

End Sub

Ich teste ob Neue_ID gültig ist, meine Frage was mache ich wenn nicht? Kann ich Sub New() mit Exit Sub Beenden? Was wird dann aus der Variabel Test? Irgendwie ist mir das nicht klar.

Gruß René
 
Wurde die variable Test nur in der subroutine deklariert ist sie auch nur dort verfügbar, in diesem fall müsste die routine den wert zurückliefern.

Ist die variable Test ein Feld der Klasse (sprich auch in anderen routinen ansprechbar),
und hätte in deinem fall die falsche formatierung drin, solltest du diese beim fehlschlagen wieder zurücksetzen.
 
Test ist eine Instanz der Klasse.

Mein Ziel wäre es, dass wenn in der Sub New() ermittelt wird, dass er Text zulang ist nothing zurückgegeben wird
 
Hallo,

ich komme zwar aus der C# Ecke, aber du könntest es so machen.
Der Code könnte so aussehen (Pseudo).
Code:
Test = null
Try
   Test=New("Falsches Format")
Catch
   ...
Im "Sub New" könntest du jetzt eine Exception werfen und damit wäre "Test" nach dem schief gegangenen New immernoch null/nothing. Im Gut Fall wäre Test dann deine gültige Instanz.
 
Hallo ksk,

wie er letztendlich feststellt, ob seine ID gültig ist oder nicht, scheint ja egal.
So wie das Problem verstanden habe, ist sein Problem aus dem Konstruktor wieder rauszukommen und danach definierte Objekte zu haben.
 
Wenn eigene Klasse, würde ich es wohl ähnlich wie @Turri halten.
Direkt eine Exception im Konstruktor schmeißen und diese entsprechend abhandeln.
Dadurch das der Konstruktoraufruf schon fehlschlägt konnte auch kein Speicher für das Feld alloziiert werden, welches für die weitere Verarbeitung herangezogen würde.

Soll die Prüfung in einer Schleife erfolgen wäre auch noch eine statische Methode denkbar, die vor dem aufruf von New prüft und die true oder false zurückgibt, ob es sich um ein gültiges Format handelt.
(Exceptions können auf die performance gehen)
 
Code:
Public Class Test
  Dim _id As String
  Public Sub New(id As String)
    // leerer Kontruktor
  End Sub

  Public Sub New(id As String)
  _id = id
.........     .........
  End Sub

  Public Shared Function check(id As String) As Test
  If (IsNumeric(id)) Then
      Return New Test(id)
  Else
      Return Nothing // oder den leeren Konstruktor zurück geben
  End If
  End Function
End Class
So ungefähr habe ich's gemeint. Man könnte statt nothing auch ein anderes Objekt übergeben.
In der Main bleib die Routine gleich bzw. unangetastet.
Gewisse Sachen wie Prüfungen sollten auch dort stattfinden wo sie hingehören.
Aber es gibt verschidene Wege.
 
Zurück