eliminieren von Microsoft.VisualBasic

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    eliminieren von Microsoft.VisualBasic

    Moin!

    ich wurde schon öfters aufgefordert meine Microsoft.VisualBasic -Codepassagen zu entfernen.

    Immer wieder mal mache ich da ein Stück weiter.

    Aber manchmal weiß ich die Alternative nicht. Deshalb werde ich in diesem Posting einmal meine offenen Punkte bei Bedarf reinstellen.

    Fangen wir heute einmal an...

    1.) vbcrlf tausche ich gegen Environment.NewLine - aber was ist der Ersatz für vbcr???

    Hier ist das mit einem Bild etwas einfacher:

    2.)


    3.)


    4.)


    Im übrigen kommen vielleicht Euch unbekannte Objekte aus AutoCAD / Topobase.

    Alternativ wäre auch interessant, wie man sonst bei diesen speziellen Objekten selber auf die Lösung kommt.

    Gruß Jan
    @jan99 So was:

    VB.NET-Quellcode

    1. Dim cr = Convert.ToChar(0x13) ' .ToString()
    2. Dim lf = Convert.ToChar(0x10).ToString()

    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!
    Hallo Rod,

    so ganz verstehe ich das noch nicht!

    Schreibe ich dann später

    VB.NET-Quellcode

    1. Dim cr = Convert.ToChar(0x13) ' .ToString()
    2. Dim Zeichenkette As String = "akdsfjaldsfj" & cr & "akdsfaldfj


    anstatt

    VB.NET-Quellcode

    1. Dim Zeichenkette As String = "akdsfjaldsfj" & vbcr & "akdsfaldfj


    ???

    Gruß Jan
    Ja. Da vbCr = Char(13), definierst Du Cr ebenfalls als Char(13) in einer Deiner Standard-DLLs, die Du bestimmt immer in Deine Programme einbindest (so mach ich es) und kannst es immer dort verwenden, wo Du es brauchst. Oder Du verwendest eben "nur" einmalig die projektweite Definition.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Zu 1.
    Siehe Antworten oben, aber je nach Fall könnte man auch einfach Environment.NewLine nehmen.

    zu 2.
    Die direkteste Entsprechung wäre wohl Convert.IsDBNull. Aber es gibt aber auch noch DBNull.Value.Equals und so zienmlich jeder DataReader hat ein isDBNull

    zu 3. & 4.
    IsNothing(Variable) wird zu Variable Is Nothing

    jan99 schrieb:

    Schreibe ich dann später ...
    Warum probierst Du das nicht einfach aus?
    Geht doch viel schneller, als nen Post zu schreiben. ;)
    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!

    HenryV schrieb:

    Zu 1.
    Siehe Antworten oben, aber je nach Fall könnte man auch einfach Environment.NewLine nehmen.


    ist das nicht vbcrlf ???

    HenryV schrieb:

    Zu 1.
    zu 3. & 4.
    IsNothing(Variable) wird zu Variable Is Nothing


    hier funktioniert das bei 3 aber nicht.

    Es steht in der Fehlerliste
    Fehler 80 Der Is-Operator akzeptiert keine Operanden vom Typ "Autodesk.AutoCAD.Geometry.Point3d". Die Operanden müssen Referenztypen sein oder Typen, die NULL-Werte zulassen. C:\VSProjects\2019\EBL.Verwaltung\EBL.Verwaltung\cls_EBL.Verwaltung_Grundst_Verz.vb 1071 81 EBL.Verwaltung


    Gruß Jan

    jan99 schrieb:

    hier funktioniert das bei 3 aber nicht.
    Glaskugelreport. Da wir Deine Klassen/Bibliotheken nicht haben, können wir auch nicht wissen, was dahinter steckt, was Du da mit Nothing vergleichst. Es scheint, als wäre Point3D eben keine Klasse, sondern eine Structure. Dann wird es wohl darauf hinauslaufen, dass Du schreibst: If GrundStkPunkt = Nothing Then
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    vbLf, vbCr & vbCrLf sind im Grunde genommen Zeilenumbrüche, also kann man in gewissen Fällen einfach Environment.NewLine nehmen.

    VB.NET-Quellcode

    1. MessageBox.Show("Test mit Convert.ToChar(10):" & Convert.ToChar(10) & "Neue Zeile")
    2. MessageBox.Show("Test mit vblf:" & Microsoft.VisualBasic.vbLf & "Neue Zeile")
    3. MessageBox.Show("Test mit Convert.ToChar(13):" & Convert.ToChar(13) & "Neue Zeile")
    4. MessageBox.Show("Test mit vbCr:" & Microsoft.VisualBasic.vbCr & "Neue Zeile")
    5. MessageBox.Show("Test mit Environment.NewLine:" & Environment.NewLine & "Neue Zeile")


    Wieso RodFromGermany aber 0x13 (HEX-Wert in c# für 19, in VB schreibt man &H statt 0x) und nicht 13 oder in HEX &H0D nimmt , ist mir nicht ersichtlich.

    HenryV schrieb:

    ist mir nicht ersichtlich.
    Da bist Du über meine C&P-Bremse gestolpert. :D
    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!
    Zu Sonderzeichen:

    Nicht alles, was im Microsoft.VisualBasic-Namespace drin ist, ist automatisch schlecht.

    Für Zeilenumbrüche verwendet man Environment.NewLine.
    "ist das nicht vbcrlf ???" Auf Windows ja, aber siehe MSDN:
    A string containing "\r\n" for non-Unix platforms, or a string containing "\n" for Unix platforms.

    Sollte man tatsächlich mal gewisse Sonderzeichen brauchen (was bei mir erstaunlich selten der Fall ist), dann findet man die wichtigsten in Microsoft.VisualBasic.ControlChars und nicht in Microsoft.VisualBasic.Constants, denn die haben vermurkste Typen (ControlChars.Tab ist vom Typ Char, wärend Constants.vbTab vom Typ String ist).

    Sollte das benötigte Zeichen da nicht dabei sein, dann hat man zwei Möglichkeiten:

    1. Microsoft.VisualBasic.Strings.ChrW:
    Nimmt einen Unicode-Codepoint entgegen und gibt ein Char zurück, das das Zeichen an diesem Codepoint repräsentiert. Beachte: Es sind nur Werte von -32768 bis 65535 erlaubt, wobei negativen Werten 32768 addiert wird (das Vorzeichenbit wird ignoriert).
    Beispiel: "Großer lateinischer Buchstabe A" hat den Unicode-Codepoint 65 (41 in Basis 16). Dieses Zeichen bekommst du mit ChrW(65), bzw. auch mit "A"c.
    Beispiel: "Arabischer Buchstabe Lam mit übergesetzten drei Punkten" hat den Unicode-Codepoint 1719 (6b7 in Basis 16). Dieses Zeichen bekommst du mit ChrW(1719), bzw. auch mit "ڷ"c.
    Beispiel: "Zeilenvorschub" hat den Unicode-Codepoint 10 (A in Basis 16). Dieses Zeichen bekommst du mit ChrW(10).
    ChrW gibt es als ganz normale Funktion im .NET-Framework, hat aber einen entscheidenden Vorteil: Der Compiler versucht, den Funktionsaufruf direkt durch eine Konstante zu ersetzen. Dadurch funktioniert z.B. Const Foo As String = "Hallo" & Microsoft.VisualBasic.ChrW(&H20) & "Welt" ohne Probleme (und auch sonst verknüpft der Compiler String- und Char-Konstanten automatisch).
    ChrW ruft intern Convert.ToChar(Int32) auf.

    2. Convert.ToChar:
    Macht das gleiche wie ChrW (wird ja davon aufgerufen), erlaubt aber nur Werte von 0 bis 65535.

    Verwende ChrW, wenn der Codepoint konstant ist, denn dadurch sparst du unnötige Funktionsaufrufe und Stringverknüpfungen und kannst das Ergebnis in Konstanten verwenden.
    Verwende Convert.ToChar, wenn der Codepoint nicht konstant ist (was extrem selten der Fall sein dürfte), denn dadurch sparst du einen unnötigen Funktionsaufruf.


    Zu IsNothing:

    Aus IsNothing(X) mach X Is Nothing. Dass du den Fehler Der Is-Operator akzeptiert keine Operanden vom Typ [...]. Die Operanden müssen Referenztypen sein oder Typen, die NULL-Werte zulassen. bekommst, zeigt ein Verständnisproblem deinerseits auf, welches durch IsNothing verschleiert wurde: Wertetypen können nie Nothing sein. Das ergibt keinen Sinn. Bei Referenztypen kann die Referenz (also der Pointer, der auf das Objekt zeigt) Nothing sein, aber bei Wertetypen gibt es keinen solche Referenz. Bei IsNothing(X) passiert folgendes: X wird ausgewertet. Das Ergebnis wird geboxt. Das heißt, das Ergebnis wird irgendwo in den Heap kopiert und zurück bekommst du eine Referenz auf die Box. Diese Referenz wird an IsNothing übergeben. IsNothing prüft, ob diese Referenz Nothing ist. Der Knackpunkt ist: Das kann nie der Fall sein, denn wenn du einen Wertetyp boxt, bekommst du ja immer die Referenz auf die Box.
    Du fragst dich jetzt vielleicht, warum du dann z.B. Dim X As Byte = Nothing oder in deinem Fall Dim X As Autodesk.AutoCAD.Geometry.Point3d = Nothing schreiben kannst? Das hat eine spezielle Bedeutung. Der Variable X wird in dem Fall der Standardwert für den jeweiligen Typ zugewiesen. Bei Byte ist das 0. Bei Structures wird jedem Feld der jeweilige Standardwert zugewiesen. Ich vermute mal, dass da drei Doubles drin sind, also wird allen drei Doubles 0.0 zugewiesen.

    Deshalb @VaporiZed: Dein Code macht nicht das gleiche. Dein Code vergleicht X mit dem Standardwert für den Typ, was übrigens auch nur funktioniert, wenn der Typ einen =-Operator bereitstellt (was er wahrscheinlich tut).


    Zu IsDBNull:
    Aus IsDBNull(X) mach TypeOf X Is DBNull*. Dann kann dir der Compiler auch wieder ein bisschen helfen. Wenn du testest, ob ein String DBNull ist, weiß der Compiler von vornherein, dass das nie sein kann und meckert dich an.
    * Wie man jetzt genau auf DBNull prüft, da scheiden sich die Geister. Ich kann mir noch drei weitere Varianten aus dem Ärmel schütteln: X Is DBNull.Value, DBNull.Value.Equals(X) und Convert.IsDBNull(X). Alle haben ihre Eigenheiten. Mit meiner Variante oben bist du auf der sicheren Seite. Aber wenn du z.B. eine Datenbank-Bibliothek verwendest, dann schau in der Dokumentation davon nach, ob irgendwelche besonderen Anweisungen dazu drin stehen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils