Array aus eigenem Datentyp > NullReferenceException

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Array aus eigenem Datentyp > NullReferenceException

    Hallo Community,

    ich schreibe mommentan an einem kleinen Consolenprogramm.

    Ich habe nun neben dem Haupt-Module folgende Klasse als Datentyp angelegt:

    VB.NET-Quellcode

    1. Class opt
    2. Public para, desc, alt As String
    3. End Class


    Wenn ich jetzt im Code des Modules die Klasse als Datentyp wie folgt verwende, bekomm ich auch keinen Fehler:

    VB.NET-Quellcode

    1. Dim test As New opt
    2. test.alt = "sda"


    Wenn ich jetzt allerdings einen Array bestehend aus meinen Datentyp anlegen will, bringt eine NullReferenceException.
    Warum?

    Mein Code:

    VB.NET-Quellcode

    1. Dim p(5) As opt
    2. p(0).para = "<ohne>"
    Was ist denn in p(0) drin ?
    Hast du da irgendwas reingetan ?
    Wenn nein, wieso versuchst du dann auf etwas zuzugreifen, was gar nicht existiert ? :)

    Ich an deiner Stelle würde sowieso lieber eine List(of T) nehmen.

    Edit: Beispiel.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Public fu(5) As foo
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. fu(0) = New foo() With {.X = 10} 'diese Zuweisung ist das Wichtige
    6. MessageBox.Show(fu(0).X.ToString())
    7. End Sub
    8. Public Class foo
    9. Public Property X As Integer
    10. End Class
    11. End Class

    samuel schrieb:

    VB.NET-Quellcode

    1. Dim p(5) As opt
    Das ist die Straße, die Häuser gibt es noch nicht.

    VB.NET-Quellcode

    1. For i = 0 To 5
    2. p(i) = New opt
    3. Next
    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!
    Hey,
    danke für die Antwort....
    Das mit der List überleg ich mir...

    Doch nochmal zu dem Array:
    Muss ich jetzt jeden Eintrag (Zeiger?) im Array mit New initialisieren?
    Kann ich das nicht alles mit einem Schritt machen?

    Ich möchte einfach einen Array bestehend aus meinem eigenen Datentyp, den ich mit Werten füllen kann...

    EDIT: Oh bereit zwei weiter Antworten, in diesem Beitrag noch nicht berücksichtigt...

    -----

    EDIT2:
    Danke RodFromGermany. Werde es wohl so machen. Hab ständig nach ner Lösung gesucht, die das in einer Zeile löst.
    Ungefähr so:

    VB.NET-Quellcode

    1. Public p(5) As opt = New opt

    Doch leider geht das mit einem Array nicht.
    Danke nochmal.

    @~blaze~: Werds mir mal anschauen. Danke

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

    samuel schrieb:

    Doch leider geht das mit einem Array nicht.
    Doch.

    VB.NET-Quellcode

    1. Public p() As opt = {New opt, New opt, New opt, New opt, New opt, New opt}
    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!
    OK. Aber je nach größe des Arrays ist die eine Zeile dann mehr oder weniger lang.

    Hab mich wohl falsch ausgedrückt...
    Ich meinte mit Lösung in einer Zeile mehr eine Art zu Deklarieren, bei der hinter jedem Zeiger automatisch der entsprechende Datentyp angelegt wird...

    EDIT:
    Habs jetzt über Structure gelöst. Hier kann ich nämlich den Array anlegen und direkt damit arbeiten.
    Danke nochmals an ~blaze~.

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

    Mein Vorhaben:

    Ich hab verschieden Operationen, die in meinem Programm aufgerufen werden können.
    Jetzt möchte ich, dass wenn der User als Attribut "help" (oder "h" bzw. "/?") angibt, er eine Übersicht aller Operationen bekommt.
    Dazu ist in dem Array zu jeder Operation der Name, die Beschreibung und alternativ Attribut gespeichert.
    Das Array gehe ich dann mit einer For durch und gebe die Operationen nacheinander aus.
    Die einzelnen Angaben zur Opperation werden in der Ausgabe farblich unterschieden. Natürlich hätte ich auch alles mit Console.WriteLine untereinander schreiben können. Jedoch muss ich dann sehr oft die ForeColer im Code ändern. Wenn ich das ganze jedoch in einer For mache, kann ich die Ausgabe inkl. Farbänderung zusammenfassen.

    Hoffe ihr habt verstanden was ich machen will.
    Aber ich glaube dies tut auch nichts zur Sache.

    Problem gelöst...

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

    Da find ich aber Structure besser. Was macht eine List besser?

    EDIT:
    Sorry total falsch verstanden... einfach diesen Beitrag ignorieren!!!

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

    Eine Liste musst du nicht fest vorgeben wieviele Elemente in ihr vorhanden sind wie bei einem Array, wo man ja vorher angeben muss Dim p(4) As String um 5 String Elemente im Array zu haben. Bei einer Liste kannst du einfach via Liste.Add() etwas hinzufügen.
    Da hast du recht...
    Obwohl über Umwege mit Redim ist dies auch bei einem Array möglich, oder gehen da alle Daten verloren?
    (Noch nie angewendet)

    EDIT:
    Allerdings finde ich ein Array in Kombination mit Structure in meinem Fall trozdem besser, da ich beim Array schon direkt auf die Attribute zugreifen kann.
    Bei einer List muss ich ihm ein Objekt übergeben, welche ich vorher anlegen müsste. (Aber hattest du ja gesagt)

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

    samuel schrieb:

    Noch nie angewendet
    Belass es dabei.
    ReDim ist eine ganz böse Funktion.
    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!
    Structures sollte man nur verwenden, wenn man zu 130% weiß, was man tut. Ich glaube du @TE weiß es nicht so recht. Klar, momentan sehen die Teile wie eine Wunderwaffe aus. Du umgehst das Anlegen von Objekten, aber warte mal ab, bis du den Preis dafür 'erfassen' kannst^^
    Ganz klar: Structures haben ihre Daseinsberechtigung, momentan benutzt du sie aber nur, um ein Problem zu umgehen.
    Wenn du die Frage "Was ist der Unterschied zwischen Werte- und Referenztyp?" (samt Konsequenzen) nicht beantworten kannst, verwende Klassen.