Spiegazione di classi statiche e membri di classi statiche in C #

La parola chiave static nel linguaggio di programmazione C # consente di definire classi statiche e membri statici.

Una classe statica è simile a una classe astratta e sigillata. La differenza tra una classe statica e una classe non statica è che una classe statica non può essere istanziata o ereditata e che tutti i membri della classe sono di natura statica. Per dichiarare una classe come statica, è necessario contrassegnarla con la parola chiave static nella dichiarazione della classe. 

Non esiste alcun comportamento in una classe o in un membro statico, quindi non ha senso consentire l'ereditarietà di una classe statica. Una classe statica può avere solo membri statici: non è possibile dichiarare membri di istanza (metodi, variabili, proprietà e così via) in una classe statica. È possibile avere un costruttore statico in una classe statica ma non è possibile avere un costruttore di istanza all'interno di una classe statica.

Quando usare una classe statica in C #

Quando dovresti frequentare un corso statico? In genere è possibile implementare classi di supporto o utilità come classi statiche poiché non è necessario creare un'istanza o ereditare e generalmente contengono una raccolta di alcuni metodi e proprietà riutilizzabili. Il listato di codice seguente illustra l'aspetto di una classe statica in C #.

classe statica pubblica FileLogger

    {

        public static void Log (string message)

        {

            // Metodo per registrare i dati in un file di testo

        }

    }

Quando usare metodi statici in C #

I metodi statici sono metodi che non necessitano di un'istanza della classe per essere invocati: possono essere chiamati sulla classe stessa. Si noti che i metodi statici possono accedere solo ai membri della classe statica. Puoi avere metodi statici all'interno di una classe statica o di una classe non statica. Inoltre, puoi avere un costruttore statico in una classe statica o in una classe non statica. Un costruttore statico viene utilizzato per inizializzare i membri statici di una classe. Il costruttore statico di una classe viene richiamato la prima volta che si accede a un membro statico della classe.

Perché dovremmo usare metodi statici? Sono un po 'più veloci nell'esecuzione rispetto ai metodi non statici, cioè i metodi di istanza. Il motivo è che il runtime passa il thispuntatore come parametro implicito ai metodi non statici o di istanza. Notare che per un metodo non statico il compilatore emette l' callvirtistruzione anche se il metodo non è virtuale. Se rendi statici i tuoi metodi, il compilatore genera callsiti non virtuali , eliminando il controllo aggiuntivo per verificare se l'istanza è nulla. Questo potrebbe darti alcuni vantaggi in termini di prestazioni.

Pertanto, se l'applicazione che si sta creando è critica per le prestazioni, potrebbe essere utile utilizzare metodi e tipi statici nel codice. I miglioramenti delle prestazioni possono essere apprezzabili se il codice effettua un numero elevato di chiamate a tali tipi e membri.

Il frammento di codice seguente illustra l'aspetto di un metodo statico.

public static void Log (string message)

        {

             string filePath = @ "F: \ Log.txt";

            using (StreamWriter streamWriter = new StreamWriter (filePath, true))

            {

                streamWriter.WriteLine (messaggio);

                streamWriter.Close ();

            }

        }

Come usare i membri statici di una classe in C #

Il CLR divide la memoria di sistema in tre regioni distinte: lo stack, l'heap e l'heap ad alta frequenza. Poiché è possibile accedere direttamente agli oggetti statici senza creare istanze della classe, devono esistere nella memoria per tutta la durata dell'applicazione; non hanno bisogno di essere raccolti nella spazzatura. Pertanto, gli oggetti statici vengono archiviati nell'heap ad alta frequenza. In genere si dispone di un heap ad alta frequenza per ogni dominio dell'applicazione.

Diamo ora un'occhiata ai membri statici di una classe. Di nuovo, un oggetto statico è quello che persiste nella memoria per tutto il tempo in cui l'applicazione è in esecuzione. Estendendo l'esempio di registrazione precedente, il listato di codice seguente illustra l'aspetto di una classe FileLogger con membri statici.

classe statica pubblica FileLogger

    {

        oggetto di sola lettura statico privato lockObject = new object ();

        stringa statica pubblica FilePath

        {

            ottenere; impostato;

        }

        public static void Log (string message)

        {

            lock (lockObject)

            {

                if (! string.IsNullOrEmpty (FilePath))

                using (StreamWriter streamWriter = new StreamWriter (FilePath, true))

                {

                    streamWriter.WriteLine (messaggio);

                    streamWriter.Close ();

                }

            }

        }

    }

Notare l'utilizzo della proprietà statica denominata FilePath. Per garantire la sicurezza dei thread, lockè stata utilizzata la parola chiave. È stato effettuato un controllo all'interno del Log()metodo per verificare che il valore della FilePathproprietà non sia nullo e non vuoto.

Ricorda, quando la velocità dell'applicazione è essenziale, potrebbe essere conveniente utilizzare metodi statici. Puoi usarli sia in classi statiche che in classi non statiche.