例如,当您在源代码中引入一个静态类时,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