In Visual Basic, le variabili all'interno delle procedure di solito perdono il loro valore dopo il termine della chiamata. La parola chiave Static consente a una variabile di mantenere il suo valore tra le chiamate della procedura.
Storia della questione:
In Visual Basic classico (VB6) e VB.NET, Static veniva spesso utilizzato per creare contatori e flag senza utilizzare i campi di una classe o di un modulo.
Problema:
Lo sviluppatore può utilizzare normali variabili locali, contando sulla loro "stabilità", mentre queste vengono azzerate ad ogni chiamata. D'altra parte, il punto scelto (corpo della procedura o blocco di codice) per la variabile statica può essere errato.
Soluzione:
Dichiarare la variabile utilizzando Static all'interno della procedura. Essa viene inizializzata una sola volta alla prima chiamata della procedura, quindi mantiene il suo valore tra le chiamate.
Esempio di codice:
Sub CountCalls() Static counter As Integer = 0 counter += 1 Console.WriteLine($"Chiamata numero: {counter}") End Sub ' Le chiamate genereranno valori diversi CountCalls() ' 1 CountCalls() ' 2 CountCalls() ' 3
Caratteristiche chiave:
Static esiste solo nell'ambito della procedura, ma mantiene il valore tra le chiamateQual è la differenza tra Static in una procedura e un campo di classe con modificatore Shared?
La variabile Static agisce solo in questa procedura: ogni istanza del metodo ottiene la propria variabile statica indipendente. Il campo Shared della classe è unico per tutta la classe.
È possibile dichiarare una variabile Static all'interno di un blocco For o If?
No, le variabili Static possono essere dichiarate solo a livello superiore della procedura, non sono ammesse all'interno di blocchi nidificati (For, If).
Cosa succede se si chiama una procedura con Static da più thread?
Nella versione VB.NET, l'ambito delle variabili Static è legato a ogni thread, il che può causare race condition e valori imprevisti durante la chiamata multithreading.
Nella procedura di calcolo della reazione dell'utente a un tasto premuto, si utilizza Static per memorizzare il tempo di attivazione, ma non si tiene conto delle pressioni simultanee da parte di più utenti (ad esempio, un'applicazione web o una finestra multithreading).
Vantaggi:
Svantaggi:
Static viene utilizzato per mantenere un contatore interno delle chiamate a un metodo utilitario, chiamato solo in modo sincrono da un unico thread.
Vantaggi:
Svantaggi: