Статичні методи не інстанціювати як такі, вони просто доступні без посилання на об'єкт.
Виклик статичного методу здійснюється через ім'я класу, а не через посилання на об'єкт, і код проміжного мови (IL) для його виклику буде викликати абстрактний метод через ім'я класу, який його визначив, не обов'язково ім'я клас, який ви використовували.
Дозвольте показати приклад.
З наступним кодом:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Якщо ви телефонуєте B.Test, ось так:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Тоді власне код всередині методу Main полягає в наступному:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Як бачимо, виклик робиться до A.Test, тому що саме клас A визначав його, а не B.Test, хоча ви можете таким чином написати код.
Якби у вас були типи класів , як, наприклад, у Delphi, де ви можете зробити змінну, що посилається на тип, а не на об'єкт, ви мали би більше використання для віртуальних і, таким чином, абстрактних статичних методів (а також конструкторів), але вони недоступні і таким чином статичні виклики є невіртуальними в .NET.
Я усвідомлюю, що IL-дизайнери могли дозволити компілювати код для виклику B.Test і вирішити виклик під час виконання, але він все одно не був би віртуальним, оскільки вам все одно доведеться записати там якесь ім’я класу.
Віртуальні методи, а отже, абстрактні, корисні лише тоді, коли ви використовуєте змінну, яка під час виконання може містити багато різних типів об'єктів, і ви, таким чином, хочете викликати правильний метод для поточного об'єкта, який ви маєте в змінній. За допомогою статичних методів вам все одно потрібно пройти ім’я класу, тому точний метод виклику відомий під час компіляції, оскільки він не може і не зміниться.
Таким чином, віртуальні / абстрактні статичні методи недоступні у .NET.