I metodi statici non sono istanziati in quanto tali, sono disponibili solo senza un riferimento all'oggetto.
Una chiamata a un metodo statico viene effettuata tramite il nome della classe, non tramite un riferimento a un oggetto, e il codice IL (Intermediate Language) per chiamarlo chiamerà il metodo astratto attraverso il nome della classe che lo ha definito, non necessariamente il nome di la classe che hai usato.
Lasciami mostrare un esempio.
Con il seguente codice:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Se chiami B.Test, in questo modo:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Quindi il codice effettivo all'interno del metodo Main è il seguente:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Come puoi vedere, la chiamata viene effettuata su A.Test, perché è stata la classe A a definirla, e non su B.Test, anche se puoi scrivere il codice in quel modo.
Se avessi tipi di classe , come in Delphi, in cui puoi creare una variabile riferendosi a un tipo e non a un oggetto, avresti più uso di metodi statici virtuali e quindi astratti (e anche di costruttori), ma non sono disponibili e pertanto le chiamate statiche non sono virtuali in .NET.
Mi rendo conto che i progettisti di IL potrebbero consentire la compilazione del codice per chiamare B.Test e risolvere la chiamata in fase di esecuzione, ma non sarebbe comunque virtuale, poiché dovresti comunque scrivere un qualche tipo di nome di classe lì.
I metodi virtuali, e quindi quelli astratti, sono utili solo quando si utilizza una variabile che, in fase di esecuzione, può contenere molti tipi diversi di oggetti, e quindi si desidera chiamare il metodo giusto per l'oggetto corrente che si ha nella variabile. Con i metodi statici devi comunque passare attraverso un nome di classe, quindi il metodo esatto da chiamare è noto al momento della compilazione perché non può e non cambierà.
Pertanto, i metodi statici virtuali / astratti non sono disponibili in .NET.