例如,當您在源代碼中引入一個靜態類時,csc編譯器會將它變成一個密封的抽象類(請糾正我,如果我錯了,請)。IL知道INTERFACE是什麼嗎?
但接口如何? CLR是否知道接口是什麼?或者編譯器將它轉換爲某種類型的聲明?
例如,當您在源代碼中引入一個靜態類時,csc編譯器會將它變成一個密封的抽象類(請糾正我,如果我錯了,請)。IL知道INTERFACE是什麼嗎?
但接口如何? CLR是否知道接口是什麼?或者編譯器將它轉換爲某種類型的聲明?
例如,當你在你的源代碼引入一個抽象類, CSC編譯器把它變成一個密封的靜態類(糾正我,如果我錯了 ,請)。
我在糾正你。
一個抽象類,如:
public abstract class Foo
{
}
看起來像這樣在IL:
.class public abstract auto ansi beforefieldinit Foo
extends [mscorlib]System.Object
{
.method family hidebysig specialname rtspecialname instance void .ctor() cil managed
{
}
}
但如何對接口; CLR是否知道接口是什麼?
是的,它知道。例如:
public interface IFoo
{
}
翻譯成:
.class public interface abstract auto ansi IFoo
{
}
我糾正了這個問題;我在帖子後注意到了它;抱歉。 – pencilCake 2012-03-09 21:54:03
@ pencilCake,答案已更新。 – 2012-03-09 21:55:43
你錯了,它是static class
,它被轉換成等效sealed abstract class
。
接口是.NET的完整成員,具有不同於任何其他類型的元數據和行爲(例如多繼承)。
完全正確;我已經解決了這個問題;我的壞(靜態類 - > IL中的密封摘要) – pencilCake 2012-03-09 21:53:13
這裏就是ILSpy給出了下面的代碼。
C#:
interface A
{
void M();
}
IL:
.class interface nested private auto ansi abstract A
{
// Methods
.method public hidebysig newslot abstract virtual
instance void M() cil managed
{
} // end of method A::M
} // end of class A
所以,是的,它不知道。
這是一個接口是什麼樣子的CLR:
.class public interface abstract auto ansi IDisposable
{
.custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = { bool(true) }
.method public hidebysig newslot abstract virtual instance void Dispose() cil managed
{
}
}
了IDisposable爲例。
如果編譯器將抽象類變成了密封類,那麼爲了實現抽象方法,任何類都可能從它派生出來? – hvd 2012-03-09 21:49:09
抽象類與靜態密封類非常不同。是什麼讓你認爲編譯器將一個變成了另一個?是的,編譯器確實創建了一個接口類型。 – 2012-03-09 21:49:22
您是否嘗試編譯程序集,然後使用ildasm查看? – 2012-03-09 21:49:22