小编典典

为什么我不能在 C# 中使用抽象静态方法?

all

最近我一直在与提供程序合作,我遇到了一个有趣的情况,我想要一个具有抽象静态方法的抽象类。我阅读了一些关于该主题的帖子,这有点道理,但是有一个很好的清晰解释吗?


阅读 156

收藏
2022-07-04

共1个答案

小编典典

静态方法不是这样 实例化 的,它们只是在没有对象引用的情况下可用。

对静态方法的调用是通过类名完成的,而不是通过对象引用,调用它的中间语言 (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 中不可用。

2022-07-04