Metody statyczne nie są tworzone jako takie, są one po prostu dostępne bez odwołania do obiektu.
Wywołanie metody statycznej odbywa się poprzez nazwę klasy, a nie przez odwołanie do obiektu, a kod języka pośredniego (IL), aby ją wywołać, wywoła metodę abstrakcyjną poprzez nazwę klasy, która ją zdefiniowała, niekoniecznie nazwę klasa, której użyłeś.
Pokażę przykład.
Z następującym kodem:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Jeśli zadzwonisz do B.Test, wykonaj następujące czynności:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Zatem rzeczywisty kod w metodzie Main wygląda następująco:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Jak widać, wywoływane jest A.Test, ponieważ to klasa A go zdefiniowała, a nie B.Test, nawet jeśli można w ten sposób napisać kod.
Gdybyś miał typy klas , takie jak w Delphi, w których możesz utworzyć zmienną odnoszącą się do typu, a nie obiektu, miałbyś więcej zastosowania dla wirtualnych, a tym samym abstrakcyjnych metod statycznych (a także konstruktorów), ale nie są one dostępne i dlatego wywołania statyczne nie są wirtualne w .NET.
Zdaję sobie sprawę, że projektanci IL mogliby umożliwić kompilację kodu w celu wywołania B.Test i rozwiązania wywołania w czasie wykonywania, ale nadal nie byłby wirtualny, ponieważ nadal musiałbyś tam napisać jakąś nazwę klasy.
Metody wirtualne, a tym samym abstrakcyjne, są użyteczne tylko wtedy, gdy używasz zmiennej, która w czasie wykonywania może zawierać wiele różnych typów obiektów, a zatem chcesz wywołać odpowiednią metodę dla bieżącego obiektu, który masz w zmiennej. W przypadku metod statycznych i tak musisz przejść przez nazwę klasy, więc dokładna metoda do wywołania jest znana w czasie kompilacji, ponieważ nie może i nie zmieni się.
Dlatego wirtualne / abstrakcyjne metody statyczne nie są dostępne w .NET.