Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Modificare le opzioni di compilazione

Guida al Visual Basic .NET

Capitolo 49° - Modificare le opzioni di compilazione

<< Precedente Prossimo >>


Esistono più modi di influire sulla compilazione di un sorgente e di modificare il comportamento del compilatore verso le sue parti. Alcuni di questi "modi" consistono nel modificare le opzioni di compilazione, che si suddividuono in quattro voci principali: Explicit, Compare, Infer e Strict. Per attivare o disattivare ognuna di esse, è possibile usare delle direttive speciali poste in testa al codice o accedere alla finestra dell'ambiente di sviluppo relativa alla compilazione. Nel secondo caso, basterà che clicchiate, dal menù principale, Project > [NomePrgetto] Properties; dalle proprietà, scegliete la seconda scheda cliccando sull'etichetta Compile sulla sinistra:
ProjectProperties_Compile.jpg
Da questo pannelo potrete anche decidere il comportamento da adottare verso certe circostanze di codice, ossia se trattarle come warning, errori, o se non segnalarle neppure.


Option Explicit

Quando Explicit è attiva, tutte le variabili devono essere esplicitamente dichiarate prima del loro uso: d'altra parte, questa è sempre stata la prassi che abbiamo adottato fin dall'inizio del corso e non ci sono particolari motivi per combiarla. Quando l'opzione è disattivata, ogni nome sconosciuto verrà trattato come una nuova variabile e creato al momento. Ecco un esempio in cui disattivo Explicit da codice:
Option Explicit Off

Module Module1
    Sub Main()
        'La variabile Stringa non viene dichiarata, ma è
        'lecito usarla e non viene comunicato alcun errore
        Stringa = "Ciao"

        'Stessa cosa per la variabile I, che non è stata
        'dichiarata da nessuna parte
        For I = 1 To 20
            Console.WriteLine(Stringa)
        Next

        Console.ReadKey()
    End Sub
End Module
Le direttive per l'attivazione/disattivazione di un'opzione di compilazione devono trovarsi sempre in cima al sorgente, anche prima di ogni altra direttiva Imports, e hanno una sintassi pressoché costante:
Option [Nome] On/Off
Anche se è possibile disattivare Explicit, è fortemente sconsigliato farlo: può produrre molti più danni che benefici. È pur vero che si usa meno codice, ma questo diventa anche meno comprensibile, e gli errori di battitura possono condannarvi a settimane di insonnia. Ad esempio:
Option Explicit Off

Module Module1
    Sub Main()
        Stringa = "Ciao"

        For I = 1 To 20
            If I > 10 Then
                Strnga = I
            End If
            Console.WriteLine(Stringa)
        Next

        Console.ReadKey()
    End Sub
End Module
Il codice dovrebbe, nelle vostre intenzioni, scrivere "Ciao" solo 10 volte, e poi stampare 11, 12, 13, eccetera... Tuttavia questo non succede, perchè avete dimenticato una "i" e il compilatore non vi segnala nessun errore a causa della direttiva Option; non riceverete neppure un warning del tipo "Unused local variable", perchè la riga in cui è presente Strnga consiste in un assegnamento. Errori stupidi possono causare grandi perdite di tempo.


Option Compare

Questa opzione non assume i valori On/Off, ma Binary e Text. Quando Compare è impostata su Binary, la comparazione tra due stringhe viene effettuata confrontando il valore dei singoli bytes che la compongono e, perciò, il confronto diventa case-sensitive (maiuscole e minuscole della stessa lettera sono considerate differenti). Se, al contrario, è impostata su Text, viene comparato solo il testo che le stringhe contengono, senza fare distinzioni su lettere maiuscole o minuscole (case-insensitive). Eccone un esempio:
Option Compare Text
Module Module1
  Sub Main()
    If "CIAO" = "ciao" Then
      Console.WriteLine("Option Compare Text")
    Else
      Console.WriteLine("Option Compare Binary")
    End If
    Console.ReadKey()
  End Sub
End Module 
Scrivendo "Binary" al posto di "Text", otterremo un messaggio differente a runtime!


Option Strict

Questa opzione si occupa di regolare le conversioni implicite tra tipi di dato differenti. Quando è attiva, tutti i cast impliciti vengono segnalati e considerati come errori: non si può passare, ad esempio, da Double a Integer o da una classe base a una derivata:
Option Strict On
Module Module1
    Sub Main()
        Dim I As Int32
        Dim P As Student

        'Conversione implicita da Double a Int32: viene
        'segnalata come errore
        I = 4.0
        'Conversione implicita da Person a Student: viene
        'segnalata come errore
        P = New Person("Mario", "Rossi", New Date(1968, 9, 12))

        Console.ReadKey()
    End Sub
End Module
Per evitare di ricevere le segnalazioni di errore, bisogna utilizzare un operatore di cast esplicito come CType. Generalmente, Strict viene mantenuta su Off, ma se siete particolarmente rigorosi e volete evitare le conversioni implicite, siete liberi di attivarla.


Option Infer

Questa opzione di compilazione è stata introdotta con la versione 2008 del linguaggio e, se attivata, permette di inferire il tipo di una variabile senza tipo (ossia senza clausola As) analizzando i valori che le vengono passati. All'inizio della guida, ho detto che una variabile dichiarata solo con Dim (ad esempio "Dim I") viene considerata di tipo Object: questo è vero dalla versione 2005 in giù, e nella versioni 2008 e successive solo se Option Infer è disattivata. Ecco un esempio:
Option Infer Off

Module Module1
    Sub Main()
        'Infer è disattivata: I viene considerata di
        'tipo Object
        Dim I = 2

        'Dato che I è Object, può contenere
        'qualsiasi cosa, e quindi questo codice non genera
        'alcun errore
        I = "ciao"

    End Sub
End Module
Provando ad impostare Infer su On, non otterrete nessuna segnalazione durante la scrittura, ma appena il programma sarà avviato, verrà lanciata un'eccezione di cast, poiché il tipo di I viene dedotto dal valore assegnatole (2) e la fa diventare, da quel momento in poi, una variabile Integer a tutti gli effetti, e "ciao" non è convertibile in intero.

<< Precedente Prossimo >>
A proposito dell'autore

C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...