Benutzerdefinierter Datentyp

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.

    Benutzerdefinierter Datentyp

    Ich hoffe ihr könnt mir weiterhelfen. Gibt es in VB eine Möglichkeit Datentypen so anzulegen:

    (Quellcode stammt aus Pascal und dient als Beispiel)

    Quellcode

    1. Type
    2. Str8 = String[8]
    3. Str12 = String[12]


    Hintergrund ist der, das ich z.B. nicht immer schreiben müsste:

    Quellcode

    1. name = String[8]
    2. vorname = String[8]
    3. Addresse = String[12]


    so (bzw. so ähnlich) sollte es in VB aussehen:

    Quellcode

    1. <VBFixedString(8)> Public Str8 As String
    2. <VBFixedString(12)> Public Str12 As String
    3. Dim Name As Str8
    4. Dim Nachname As Str8
    5. Dim Addresse As Str12


    Hoffe ihr versteht was ich meine :D mit Structures habe ich es schon probiert,
    leider ist es nicht 100% das was ich brauche. Auch die Beispiele aus dem MSDN
    haben nicht geholfen. Es kann natürlich sein das ich dabei etwas übersehen habe,
    wenn es so ist lasse ich mich gern korrigieren!

    Lg
    Sag nochmal in Worten (ohne Code) was du machen möchtest.
    Hab das so jetzt nicht rauslesen können ^^

    Edit:

    Ah jetzt hat es *klick* gemacht:

    Mit den Strukturen liegst du da nicht falsch.

    VB.NET-Quellcode

    1. Structure Auto
    2. Dim Marke As String
    3. Dim Farbe As String
    4. Dim Tueren As Integer
    5. Dim Cool As Boolean
    6. End Structure
    7. Private Golf As Auto
    8. Golf.Marke = "VW"
    9. Golf.Farbe = "Schwarz"
    10. Golf.Tueren = 5
    11. Golf.Cool = False

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Eistee“ ()

    Um das Zuweisen wirst du nicht drum herraum kommen.

    Die Einzigste möglichkeit die ich sehe um das ganze abzukürzen, wäre Schleifen bei der zuweisung zu nutzen!
    Du musst nur gucken das die Quelldaten dabei richtig sortiert sind.
    Es ist in .NET nicht üblich, Strings in ihrer Länge zu begrenzen.
    Wenn Du Strings begrenzen willst, nimm Char(8). Dies geht aber nur als separate Klasse, nicht als Struktur:

    VB.NET-Quellcode

    1. Public Class Str8
    2. Public Name(8) As Char
    3. 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!
    Es geht ihm ums prinziep.

    In pascal ist eine solche ich nenns mal typisierung einfach, in vb wusste ich nicht wie es gehen sollte

    Aber es geht bestimmt, ich habs warscheinlich nur vergessen

    Btw warum wechselst du von pascal zu vb bleib doch bei pascal und verwende delphi bzw delphi prism wenn du das .net verwenden möchtest
    Danke für die vielen Antworten!

    Also Warfley und BugBeep haben recht. Ich möchte einen eigenen Typen erstellen, der so zugewiesen werden kann, wie die Allgemeinen schon vorhanden Datentypen (Integer, String, Boolean, etc.). Dies funktioniert nur leider nicht per Structure.

    Sollte VB wirklich kein Feature besitzen mit dem ich das umsetzen kann, werde ich wohl doch auf Delphi umsteigen müssen :D obwohl ich mir eigentlich nicht vorstellen kann, dass eine so einfache Sache nicht irgendwie vorhanden sein soll.

    Das Problem ist einfach das ich den kompletten Quellcode aus dem Pascal Programm gern übernehmen würde, ohne es komplett umschreiben zu müssen. Schon das Modul mit allen Variablen und Konstanten ist knapp 4 Seiten lang, das Modul mit allen Funktionen 20. Der Aufwand wäre gigantisch und die Fehlersuche noch schlimmer. (Man soll ja das Rad nicht neu erfinden) :D

    Danke übrigens an RodFromGermany für die Information über Stringbegrenzung.

    Samus schrieb:

    Ich möchte einen eigenen Typen erstellen, der so zugewiesen werden kann

    Dann gib doch noch mal ein anderes Beispiel als das mit String[8] (weil das halt in .Net grundsätzlich eher unüblich ist). Denn so ganz genau verstehe ich jetzt nicht, wo das Problem ist. Jedenfalls ist "String[8]" ja schon mal kein "eigener" Typ im engeren Sinne.
    Was macht den Pascal / Delphi, wenn Du diese Zuweisung vornimmst:

    Quellcode

    1. str8 = "123"
    2. str8 = "123456789"

    In .NET kannst Du Dir doch eine Prozedur generieren, die dann dafür sorgt, dass die Variable nur 8 oder n Zeichen hat:

    VB.NET-Quellcode

    1. Public Function LimitString(txt As String, limit As Integer) As String
    2. If txt.Length < Limit Then Return txt
    3. Return txt.SubString(0, limit)
    4. End Function

    Wozu soll denn diese Limitierung überhaupt gut sein?
    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!
    Also der Sinn dahinter ist der, das man in Pascal (& Delphi) eigenen Variablentypen festlegen kann und zwar mit

    Quellcode

    1. Type 'Alles was danach kommt, ist keine Variable - sondern halt ein benutzerdefinierter Dateityp ^^
    2. Str8 = String[8]; 'Dateityp der die Variable als String mit der länge von 8 Zeichen deklariert
    3. Feld10 = Array[1..10] of Integer; 'Dateityp der die Variable als Array vom Typ Integer mit dem Bereich von 1-10 deklariert


    somit kann man bei der Deklaration von Variablen eine 'vereinfachte' schreibweise benutzen

    Quellcode

    1. Var 'Alles war danach kommt sind Variablen (nur Beispiele), (Variablenname) : (Variablentyp)
    2. Name : Str8;
    3. Vorname : Str8;
    4. Benutzer : Feld10;
    5. Passwort : Feld10;


    Aber eigentlich hat es sich sowieso erledigt, hab Warfleys Vorschlag überdacht und werde wirklich auf Delphi umsteigen.
    Trotzdem danke für eure Hilfe und falls jemandem doch eine Möglichkeit einfällt - bin interessiert :)

    Samus schrieb:

    ...obwohl ich mir eigentlich nicht vorstellen kann, dass eine so einfache Sache nicht irgendwie vorhanden sein soll.
    Da haste natürlich voll recht - klar gibts Arrays auch in VB.

    Werden auch fast genauso deklariert:

    VB.NET-Quellcode

    1. Dim Feld10 As Integer(9) 'Integer-Array mit 10 Ints, von (0 - 9)


    Nur Strings ticken ganz anders. Die werden automatisch in ihrer Länge angepasst, sodasses da nicht zu ÜberlaufFehlern kommt, wenn man einen langen String an eine zu kurze Variable zuweist.
    Das mittm Überlauf habnoch in übler Erinnerung aus C (ohne # oder ++) - Gottseidank hat man das Theater in .Net nichmer.
    es geht hier um typisierung

    z.b.

    in pascal kann man wenn man z.b. einen variablen typ hätte mit dem namen: irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben
    könnte man einfach sagen

    type

    txtvar = irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben
    und man könnte variablen vom typ
    txtvar erstellen, die aber eig vom typ irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben sind

    Warfley schrieb:

    es geht hier um typisierung

    z.b.

    in pascal kann man wenn man z.b. einen variablen typ hätte mit dem namen: irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben
    könnte man einfach sagen

    type

    txtvar = irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben
    und man könnte variablen vom typ
    txtvar erstellen, die aber eig vom typ irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben sind

    Ähnliches kann VB auch (ich hoffe, ich verstehe richtig)

    VB.NET-Quellcode

    1. Imports typ = ProjectNamespace.irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben
    2. Public Class irgendeinsinnlosertextohnevielbedeutungeinfachnurscheissezuschreiben
    3. Public Sub foo()
    4. Dim x As typ
    5. End Sub
    6. End Class

    Warfley schrieb:

    in delphi ist diese nötig...

    Das sollte doch Drund genug sein, Delphi den Rücken zuzukehren.
    Wenn ich mit meiner Freundin von Berlin nach Leipzig will, nehme ich doch kein Tandem, weil ein Tandem 2 Sattel hat, sondern ein Auto und lasse halt 2 oder 3 Sitze frei.
    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!

    Warfley schrieb:

    Das ist ein teil der sicheren syntax von delphi,

    Gnampf?

    Sieht eher wie ein Überbleibsel aus der Steinzeit aus. So wie die Unterscheidung von Groß/Klein bei C/C++. Die erfüllt nämlich auch keinen wirklichen Zweck, sondern stammt wohl eher daher, dass Speicherplatz (auch für Quellcode) "damals" begrenzt war, so dass man versucht hat, den gesamten Zeichenraum zu nutzen (pers. Vermutung!)
    Und in Zeiten von Intellisense macht auch das "kürzen" von Variablennamen nicht mehr viel Sinn. Und VarNamen sind in Zeiten objektorientierter (auch keine Urdomäne von Pascal) Programmierung eher selten lang. Wenn schon dann der gesamte "Baum", aber da kann man ja mit Using/Imports/With kürzen.

    Aber ihc lass mich belehren. Wieso erhöht dieses "Alias"-Konstrukt die Sicherheit??

    EDIT:
    Zum Thema uppercase/lowercase. tutortial von Brian Kernighan:
    lysator.liu.se/c/bwk-tutor.html
    Zitat:
    "Variable names have one to eight characters, chosen from A-Z, a-z, 0-9, and _, and start with a non-digit."
    Bei größeren Projekten wäre also die Nichtunterscheidung von Variablennamen ein Problem gewesen. Heute ist es der heilige Gral der C'ler und ... absoluter Schwachsinn. Ebenso schwachsinnig wie in VB nicht zwischen "=" (Vergleich) und "=" (Zuweisung) zu unterscheiden. Eine bedauernswerte Altlast. Und da dürfte auch das akutelle Problem dazugehören - sofern mir keiner den tieferen Sinn erklären kann.

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