Option Strict On

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

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

    Der Unterschied ist, dass "Option Strict Off" die Konvertierungen für Dich durchführt, "dynamic" dies aber nicht macht und spätestens zur Laufzeit fliegt Dir das um die Ohren. Man sollte sich der Unterschiede schon klar sein.

    =

    =

    Schon klar, dass es sich zur Compile-Zeit ähnlich verhält, jedoch passiert unter der Haube was Anderes.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Unterscheide bitte zwischen Kompilierzeit und Laufzeit.

    Dynamic legt den Typ zur Laufzeit auf einen Integer-Wert fest.
    VB.NET legt den Typ ebenfalls erst zur Laufzeit fest.

    Wie ich vorher schon geschrieben habe, lösen beide Fälle keine Kompilierzeitfehler aus.

    Einziger Unterschied: VB.NET konvertiert intern den Integer-Wert zu einem String. Das macht C# nicht. Hat aber nichts mit der Aussage zutun, dass ich den Datentypen NICHT angeben muss, was beweist, das auch in C# eine implizite Typisierung möglich ist.

    EDIT: @SpaceyX: Da haben sich unsere Posts wohl überschnitten. ;)

    Springen wir nochmal zum Anfang also den Post von @RodFromGermany in dem ich geschrieben habe, dass Microsoft auch in C# ähnliche Möglichkeiten implementiert hat, die Option Strict Off bietet. Und eine der Hauptunterschiede zwischen Option Strikt On und Off ist die implizite Typisierung und diese ist in C# möglich. Denn implizit heißt doch, dass sich der Typ erst aus dem Kontext zur Laufzeit ergibt. Von der Konvertierung erstmal abgesehen. Da denke ich eher, dass Microsoft hier eine zusätzlich Annehmlichkeit implementiert hat, weil Option Strict Off ja zunächst mal der Standard in einer neuen Anwendung ist und die in C# nicht notwendig ist, weil man im Regelfall gezwungen ist explizit zu typisieren und Dynamic nicht Standard sondern Abweichung vom Regelfall bietet.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Eine implizite Typisierung ist aber was Anderes.

    C#-Quellcode

    1. var x = 10;


    oder

    VB.NET-Quellcode

    1. Dim x = 10


    ist eine implizite Typisierung. Das darfst Du bitte nicht verwechseln. In beiden Fällen hat "x" einen konkreten Typ. Der Typ wird aus dem Wert abgeleitet, der zugewiesen wird. "Option Strict Off" und "dynamic" schalten die Typ-Prüfung zur Compile-Zeit aus. Compile-Zeit heisst, Dein Code wird übersetzt, im Falle von .NET nach IL. Der Unterschied zwischen beiden ist, dass "Option Strict Off" alles Mögliche im Hintergrund macht, damit das Programm auch zur Laufzeit, Dein Programm ist in den Speicher geladen und wird ausgeführt, möglichst keine Laufzeitfehler auslöst. Sprich, es werden Typen ohne Dein Zutun von a nach b (wenn möglich) konvertiert. "dynamic" macht dies aber nicht. Kommt Dein Programm nun zu der Stelle, wo Du versuchst, einem Int einen String zuzuweisen, endet die Ausführung mit einem Runtime-Error. Da bei "Option Strict Off" schon konvertiert wurde, passiert dies hier nicht.

    Mit "dynamic" sagst Du praktisch: "Ich bin mir sicher, was ich mache." Mit "Option Strict Off" heisst dies eher: "Ich weiß vielleicht, was ich mache. Schau aber nochmal drüber." Zur Compile-Zeit verhalten sich beide gleich, damit hast Du Recht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Eine implizite Typisierung ist aber was Anderes.


    Ah okay, jetzt verstehe ich warum wir aneinander vorbeireden. Du musst unterscheiden zwischen implizite Typisierung und implizite Konvertierung. Wir reden hier die ganze Zeit von zwei unterschiedlichen Dingen.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    also ich sehe tatsächlich dynamic als besserer Nachbau von Strict Off.
    Manchmal ist late binding eben praktisch - das haben auch die c#ler iwann gesehen.
    Es ist aber immer gefährlich, und in c# erfreulicherweise eigentlich nicht vorgesehen (in vb.net aber leider die leidige Voreinstellung).
    Wenn also ein c#ler dynamic verwendet, etwa weil bestimmte Office-Typen in verschiedenen Versionen rumfahren, und er nicht jedes' Anwenders System scannen will, welches Office da installiert ist - da nimmt der c#ler vielleicht dynamic, und weiss, was er tut.

    Ein vb-strict-off-progger merkt das überhaupt nicht. Er weiss nicht, dass ein String was anneres ist als ein Integer, wieso sollte er wissen, dass ein Excel97-Range was anneres ist als ein Excel-2000-Range?