Konstruktor - innerhalb Konstruktor mit anderen Parametern aufrufen

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

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

    In C# ist es möglich, indem Du einfach hinter die Signatur : this(parameter) anhängst.
    In VB.NET müsste das so gehen:

    VB.NET-Quellcode

    1. Public Class Test
    2. Public Sub New()
    3. Me.New(0)
    4. End Sub
    5. Public Sub New(x As Integer)
    6. End Sub
    7. End Class


    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    In VB.NET
    geht das genau so, allerdings würde von der Logik her der Konstruktor mit vielen Parametern den mit weniger Parametern aufrufen:

    VB.NET-Quellcode

    1. Public Class Test
    2. Public Property xxx As Integer
    3. Public Sub New()
    4. xxx = 42
    5. End Sub
    6. Public Sub New(value As Integer)
    7. Me.New()
    8. xxx = value
    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!
    Ich sehe das anders, der Konstruktor/die Methode mit vielen Parametern (der der die Arbeit verrichtet) wird von dem mit wenigen aufgerufen (als Verkürzung/mit Defaultwerten).

    slice schrieb:

    als Verkürzung/mit Defaultwerten
    präferiere ich Optional-Parameter.
    Für mich ist eine Überladung nur sinnvoll, wenn tatsächlich unterschiedliche Datentypen gefordert sind.

    VB.NET-Quellcode

    1. Public Class Test
    2. Public Property xxx As Integer
    3. Public Sub New(Optional value As Integer=42)
    4. xxx = value
    5. End Sub
    6. End Class
    Nur weil Optional bei C# lange Zeit nicht möglich war, ist das für mich kein Grund, bei VB.Net darauf zu verzichten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @RodFromGermany Sorry, aber ich sehe in Deinem Beispiel da keinen Sinn, außer, dass Du unnötig xxx zuerst auf 42 setzt. Daher gebe ich @slice da vollkommen recht. Der Konstruktor, der die eigentliche Arbeit erledigt, sollte vom "kleineren" aufgerufen werden und einfach ein paar Standardwerte mitgeben (insofern es nicht sowieso ein Wertetyp ist, dessen default (also i.d.R 0) man haben möchte).
    Und optionale Parameter bei Konstruktoren, naja, ich persönlich würde lieber direkte Überladungen anbieten.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    optionale Parameter bei Konstruktoren
    Ich sehe da keinen Unterschied zwischen einem Konstruktor und einer normalen Methode.

    Ich weiß, dass ich in diesem Forum kaum jemand für optionale Parameter erwärmen kann (warum eigentlich?).
    Ich persönlich schreibe lieber 3 Überladungen mit 2 optionalen Parametern anstatt 12 Überladungen.
    Aber das darf gerne jeder halten, wie er möchte.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Trade schrieb:

    unnötig
    Sorry, Du hast Recht. Der Konstruktor mit keinem Parameter ruft den mit einem Parameter auf, der den mit 2 Parametern usw.

    petaod schrieb:

    optionale Parameter
    Ich habs gerade mal probiert, die IDE macht das inzwischen auch ganz sauber (mir fällt nur ein, dass das dem @ErfinderDesRades missfällt):
    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!

    RodFromGermany schrieb:

    mir fällt nur ein, dass das dem @ErfinderDesRades missfällt
    hmm - was?

    Optionale Parameter finde ich sehr nützlich, solange man ein paar Regeln beachtet. Oder vlt. ists nur eine Regel: Wähle den optionalen Parameter so, dass du ihn späterhin nie wieder ändern musst.
    Bzw. wenn du garantieren kannst, dass aller Code, der von der Methode abhängt, mit neu-compiliert wird, dann ist auch das ändern optionaler Parameter-Werte kein Problem.

    Jo, und wenn möglich gebe ich Methoden (auch Sub New) optionalen Params den Vorzug vor der Alternative, die da heisst: "Überladung".
    Weil beim Aufruf einer Methode mit optionalen Parameter zeigt Intellisense den Paramter mit seim Default-Wert an. Man sieht also, was man kriegt (Wysiwyg).
    Bei einer Überladung weiß man oft garnet, dass es den anderen Paremeter überhaupt gibt (nämlich wenn der nur in der anderen Überladung gezeigt wird), und schon garnet weiß man seine Vorbelegung (die ja trotzdem getätigt wird).