Các phương thức tĩnh không được khởi tạo như vậy, chúng chỉ khả dụng mà không cần tham chiếu đối tượng.
Một cuộc gọi đến một phương thức tĩnh được thực hiện thông qua tên lớp, không phải thông qua một tham chiếu đối tượng và mã Ngôn ngữ trung gian (IL) để gọi nó sẽ gọi phương thức trừu tượng thông qua tên của lớp đã định nghĩa nó, không nhất thiết phải là tên của lớp bạn đã sử dụng.
Hãy để tôi chỉ ra một ví dụ.
Với đoạn mã sau:
public class A
{
public static void Test()
{
}
}
public class B : A
{
}
Nếu bạn gọi B.Test, như thế này:
class Program
{
static void Main(string[] args)
{
B.Test();
}
}
Sau đó, mã thực tế bên trong phương thức Main như sau:
.entrypoint
.maxstack 8
L0000: nop
L0001: call void ConsoleApplication1.A::Test()
L0006: nop
L0007: ret
Như bạn có thể thấy, cuộc gọi được thực hiện cho A.Test, vì đó là lớp A đã định nghĩa nó chứ không phải B.Test, mặc dù bạn có thể viết mã theo cách đó.
Nếu bạn có các loại lớp , như trong Delphi, nơi bạn có thể tạo một biến tham chiếu đến một loại chứ không phải một đối tượng, bạn sẽ sử dụng nhiều hơn cho các phương thức tĩnh ảo và do đó trừu tượng (và cả các hàm tạo), nhưng chúng không có sẵn và do đó, các cuộc gọi tĩnh là không ảo trong .NET.
Tôi nhận ra rằng các nhà thiết kế IL có thể cho phép mã được biên dịch để gọi B.Test và giải quyết cuộc gọi khi chạy, nhưng nó vẫn không phải là ảo, vì bạn vẫn sẽ phải viết một loại tên lớp ở đó.
Các phương thức ảo, và do đó là các phương thức trừu tượng, chỉ hữu ích khi bạn đang sử dụng một biến, trong thời gian chạy, có thể chứa nhiều loại đối tượng khác nhau và do đó bạn muốn gọi đúng phương thức cho đối tượng hiện tại mà bạn có trong biến. Với các phương thức tĩnh, dù sao bạn cũng cần phải đi qua một tên lớp, vì vậy phương thức chính xác để gọi được biết đến vào thời gian biên dịch vì nó không thể và sẽ không thay đổi.
Vì vậy, các phương thức tĩnh ảo / trừu tượng không có sẵn trong .NET.