簡體   English   中英

C#中的運行時類型與編譯時類型

[英]Run-time type vs compile-time type in C#

C#中的運行時類型和編譯時類型之間有什么區別?虛擬方法調用有什么含義?

假設我們有兩個類AB聲明如下:

internal class A
{
    internal virtual void Test() => Console.WriteLine("A.Test()");
}

internal class B : A
{
    internal override void Test() => Console.WriteLine("B.Test()");
}

B繼承自A並覆蓋方法Test ,該方法將消息輸出到控制台。


C#中的運行時類型和編譯時類型有什么區別

現在讓我們考慮以下聲明:

A test = new B();

  • 在編譯時:編譯器只知道變量testA類型。 他不知道我們實際上是在給他一個B的例子。 因此,編譯類型的testA

  • 在運行時:已知test類型為B ,因此運行時類型為B


以及虛擬方法調用存在什么含義

請考慮以下代碼語句:

((A)new B()).Test();

我們正在創建一個B實例,將其轉換為A並在該對象上調用Test()方法。 編譯器類型為A ,運行時類型為B

當編譯器想要解析.Test()調用時,他遇到了問題。 因為A.Test()virtual所以編譯器不能簡單地調用A.Test因為存儲的實例可能已經覆蓋了該方法。

編譯本身無法確定調用A.Test()B.Test() 被調用的方法由運行時確定,而不是由編譯器“硬編碼”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM