最近我一直在与提供程序合作,我遇到了一个有趣的情况,我想要一个具有抽象静态方法的抽象类。我阅读了一些关于该主题的帖子,这有点道理,但是有一个很好的清晰解释吗?
静态方法不是这样 实例化 的,它们只是在没有对象引用的情况下可用。
对静态方法的调用是通过类名完成的,而不是通过对象引用,调用它的中间语言 (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 中不可用。