Che cos'è un "metodo statico" in C #?


177

Cosa significa quando aggiungi la parola chiave statica a un metodo?

public static void doSomething(){
   //Well, do something!
}

Puoi aggiungere la staticparola chiave alla classe? Cosa significherebbe allora?


9
È possibile utilizzare il metodo statico senza creare un'istanza di quella classe semplicemente class_name.static_method_name ();
Javed Akram,

A livello di programmazione, abbiamo la sensazione di essere in grado di chiamare un metodo statico senza creare un'istanza di una classe / tipo. Internamente è non è il caso. CLR gestisce internamente un'istanza speciale chiamata istanza di tipo per la gestione di chiamate a metodi statici. Si prega di vedere questa risposta. È così intrigante.
RBT

Risposte:


313

Una staticfunzione, a differenza di una normale funzione ( istanza ), non è associata a un'istanza della classe.

Una staticclasse è una classe che può contenere solo staticmembri e quindi non può essere istanziata.

Per esempio:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

Per chiamare InstanceMethod, è necessaria un'istanza della classe:

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
Quindi è come un metodo di classe anziché un metodo di istanza?
Moshe,

4
@Moshe: esattamente. Con un metodo statico non è necessaria un'istanza della classe per chiamare il metodo, ma solo la classe.
Binary Worrier

3
Ma esiste davvero una sorta di limitazione tecnica che impedisce di chiamare un metodo statico su un'istanza? Se il compilatore lo consentirebbe, qual è il pericolo che sia accessibile?
kroonwijk,

2
@kroon: non avrebbe alcun senso. I metodi di istanza in realtà prendono solo un'istanza come primo parametro nascosto. I metodi statici no. Vedi il mio post sul blog: blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

Dove "StaticMethod" è il metodo Class e "InstanceMethod" è un metodo Instance della classe SomeClass
Usman Younas

26

Da un altro punto di vista: considera che vuoi apportare alcune modifiche su una singola stringa. ad esempio, si desidera rendere le lettere maiuscole e così via. si crea un'altra classe denominata "Strumenti" per queste azioni. non ha senso creare un'istanza della classe "Strumenti" perché non vi è alcun tipo di entità disponibile all'interno di quella classe (confronta con la classe "Persona" o "Insegnante"). Quindi usiamo una parola chiave statica per usare la classe "Strumenti" senza fare alcuna istanza e quando si preme punto dopo il nome della classe ("Strumenti") è possibile avere accesso ai metodi desiderati.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
L'uso di "apportare modifiche su una stringa" è un cattivo esempio: le stringhe sono immutabili e non possono essere modificate. Ma, altrimenti, la spiegazione ha un senso (sostituendo una classe non immutabile per stringa)
Flydog57

13

Un metodo, un campo, una proprietà o un evento statici sono richiamabili su una classe anche quando non è stata creata alcuna istanza della classe. Se vengono create istanze della classe, non possono essere utilizzate per accedere al membro statico. Esiste una sola copia di campi ed eventi statici e i metodi e le proprietà statici possono accedere solo a campi statici ed eventi statici. I membri statici vengono spesso utilizzati per rappresentare dati o calcoli che non cambiano in risposta allo stato dell'oggetto; ad esempio, una libreria matematica potrebbe contenere metodi statici per il calcolo di seno e coseno. I membri della classe statica vengono dichiarati utilizzando la parola chiave statica prima del tipo restituito della parte


5

La funzione statica significa che è associata alla classe (non una particolare istanza della classe ma la classe stessa) e può essere invocata anche quando non esistono istanze della classe.

Classe statica significa che la classe contiene solo membri statici.


5

A breve non è possibile creare un'istanza della classe statica: Es:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

Non puoi fare così:

myStaticClass msc = new myStaticClass();  // it will cause an error

Puoi fare solo:

myStaticClass.someFunction();

0

Quando aggiungi una parola chiave "statica" a un metodo, significa che l'implementazione sottostante fornisce lo stesso risultato per qualsiasi istanza della classe. Inutile dire che il risultato varia con la modifica del valore dei parametri


-1

La variabile statica non si collega all'oggetto della classe. È possibile accedervi usando classname. Tutti gli oggetti della classe condivideranno la variabile statica.

Rendendo la funzione come statica, limiterà l'accesso di quella funzione all'interno di quel file.


-1

Nucleo della parola chiave statica che avrai una sola copia nella RAM di questo (metodo / variabile / classe) che è condivisa per tutte le chiamate


-8

La parola chiave statica, quando applicata a una classe, indica al compilatore di creare una singola istanza di quella classe. Non è quindi possibile "nuovo" una o più istanze della classe. Tutti i metodi in una classe statica devono essere dichiarati statici.

È possibile, e spesso desiderabile, avere metodi statici di una classe non statica. Ad esempio, un metodo factory durante la creazione di un'istanza di un'altra classe viene spesso dichiarato statico poiché ciò significa che non è richiesta una particolare istanza della classe contenente il metodo factor.

Per una buona spiegazione di come, quando e dove vedere MSDN


8
No, una classe statica non viene mai istanziata. Dato che tutto ciò che è statico, perché si vuole creare un'istanza di esso?
Jon Skeet,

1
Una staticclasse non ha alcuna istanza.
SLaks

4
Scusate ragazzi, non capisco ... Ho detto che è stata creata una singola istanza e non è possibile crearne una nuova. Sicuramente viene creata una singola istanza statica, altrimenti il ​​codice non sarebbe richiamabile?
Dave Arkley,

2
Una classe statica ha un'istanza, in effetti due, semplicemente non sono istanze di theType. Esiste una classe statica sull'heap come oggetto di tipo [Foo] (tabella di ricerca del metodo, ecc. Per JIT) e un oggetto System.Type speciale utilizzato per l'inizializzazione.
McCainz,

Una classe può essere dichiarata statica, indicando che contiene solo membri statici. Non è possibile creare istanze di una classe statica utilizzando la nuova parola chiave. Le classi statiche vengono caricate automaticamente dal Common Language Runtime (CLR) di .NET Framework quando viene caricato il programma o lo spazio dei nomi contenente la classe.
Satheesh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.