2012-03-09 52 views
2

例如,當您在源代碼中引入一個靜態類時,csc編譯器會將它變成一個密封的抽象類(請糾正我,如果我錯了,請)。IL知道INTERFACE是什麼嗎?

但接口如何? CLR是否知道接口是什麼?或者編譯器將它轉換爲某種類型的聲明?

+4

如果編譯器將抽象類變成了密封類,那麼爲了實現抽象方法,任何類都可能從它派生出來? – hvd 2012-03-09 21:49:09

+2

抽象類與靜態密封類非常不同。是什麼讓你認爲編譯器將一個變成了另一個?是的,編譯器確實創建了一個接口類型。 – 2012-03-09 21:49:22

+0

您是否嘗試編譯程序集,然後使用ildasm查看? – 2012-03-09 21:49:22

回答

10

例如,當你在你的源代碼引入一個抽象類, 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 
{ 
} 
+0

我糾正了這個問題;我在帖子後注意到了它;抱歉。 – pencilCake 2012-03-09 21:54:03

+0

@ pencilCake,答案已更新。 – 2012-03-09 21:55:43

7

你錯了,它是static class,它被轉換成等效sealed abstract class

接口是.NET的完整成員,具有不同於任何其他類型的元數據和行爲(例如多繼承)。

+0

完全正確;我已經解決了這個問題;我的壞(靜態類 - > IL中的密封摘要) – pencilCake 2012-03-09 21:53:13

3

這裏就是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 

所以,是的,它不知道。

1

這是一個接口是什麼樣子的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爲例。