例如,当您在源代码中引入静态类时,csc 编译器会将其转换为密封的抽象类(如果我错了,请纠正我)。
但是接口呢?CLR 知道接口是什么吗?还是编译器将其转换为某种类型声明?
例如,当您在源代码中引入静态类时,csc 编译器会将其转换为密封的抽象类(如果我错了,请纠正我)。
但是接口呢?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
{
}
你错了,它static class
是转换为等效的sealed abstract class
.
接口是.NET 的完整成员,具有与任何其他类型不同的元数据和行为(例如多重继承)。
以下是 ILSpy 针对以下代码显示的内容。
C#:
interface A
{
void M();
}
伊利诺伊:
.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 为例。