C# 接口编译

C# 接口编译,c#,class,inheritance,interface,compilation,C#,Class,Inheritance,Interface,Compilation,关于C#中接口的快速问题。我想知道它们究竟是如何编译和在汇编方面使用的 我认为接口没有编译成汇编。我认为接口定义是在编译时编译到类中的,因此接口本质上是一个高级语言概念 有人能告诉我我的想法是否正确吗?当我读到接口不是实例化的,它们是它们自己的实体时,我得出了这个结论。然而,另一方面,我也读到它们是引用类型,这让我感到困惑,因为这表明它们是实例化的 非常感谢。没有接口是不可实例化的(这是一个词吗?),但它们是“实类型”,您可以拥有接口类型的变量,并且您可以在运行时使用反射访问此类型信息,因此它们

关于C#中接口的快速问题。我想知道它们究竟是如何编译和在汇编方面使用的

我认为接口没有编译成汇编。我认为接口定义是在编译时编译到类中的,因此接口本质上是一个高级语言概念

有人能告诉我我的想法是否正确吗?当我读到接口不是实例化的,它们是它们自己的实体时,我得出了这个结论。然而,另一方面,我也读到它们是引用类型,这让我感到困惑,因为这表明它们是实例化的


非常感谢。

没有接口是不可实例化的(这是一个词吗?),但它们是“实类型”,您可以拥有接口类型的变量,并且您可以在运行时使用反射访问此类型信息,因此它们确实存在于编译的程序集中。

没有接口是不可实例化的(这是一个词吗?),但它们是“实类型”,您可以拥有接口类型的变量,并且可以在运行时使用反射访问此类型信息,因此它们确实存在于已编译的程序集中。

接口必须转换为二进制文件。Once可能认为应该将它们编译成一个类,但这是错误的,因为接口可以由多个类实现。想象一个案例,当你有一个项目,你有20种类型的树实现。当然,如果你有一个树的接口,它将由每个类实现,那么,如果事情按照你的想法进行,那么同一个接口将被编译成20个类。现在,想象一下由许多类实现的具有许多接口的大型项目。您将意识到这将意味着浪费大量资源。

必须将接口转换为二进制文件。Once可能认为应该将它们编译成一个类,但这是错误的,因为接口可以由多个类实现。想象一个案例,当你有一个项目,你有20种类型的树实现。当然,如果你有一个树的接口,它将由每个类实现,那么,如果事情按照你的想法进行,那么同一个接口将被编译成20个类。现在,想象一下由许多类实现的具有许多接口的大型项目。您会意识到这将意味着浪费大量资源。

我刚刚反汇编了一个只包含一个接口的小程序:

public interface IFoo {
    void Foo();
}
这就是我从中得到的:

.class interface public auto ansi abstract IFoo {
    // method line 3
    .method public virtual hidebysig newslot abstract 
       instance default void Foo ()  cil managed 
    {
       // Method begins at RVA 0x0
    } // end of method IFoo::Foo
} // end of class IFoo

因此,如果你所说的汇编是指MSIL,那么答案是肯定的,它们被视为类。

我只是反汇编了一个只包含一个接口的小程序:

public interface IFoo {
    void Foo();
}
这就是我从中得到的:

.class interface public auto ansi abstract IFoo {
    // method line 3
    .method public virtual hidebysig newslot abstract 
       instance default void Foo ()  cil managed 
    {
       // Method begins at RVA 0x0
    } // end of method IFoo::Foo
} // end of class IFoo

因此,如果你所说的汇编是指MSIL,那么答案是肯定的,它们被当作类来对待。

“我想象接口没有编译成汇编”当然是这样,否则其他汇编将无法使用它们。甚至
内部
接口也在程序集中。它们不会在编译时“烘焙”到类中,否则它们可能与其他实现者没有关系。将接口想象成契约,您承诺实现类遵守契约。契约可以传递并用作实际实现的代理。接口没有实现,因此程序集中不会有任何MSIL。但它仍然是一个类型,因此它将像任何类型一样出现在元数据中。创建元数据当然是编译器的工作。“我想象接口没有被编译成程序集”确实如此,否则其他程序集将无法使用它们。甚至
内部
接口也在程序集中。它们不会在编译时“烘焙”到类中,否则它们可能与其他实现者没有关系。将接口想象成契约,您承诺实现类遵守契约。契约可以传递并用作实际实现的代理。接口没有实现,因此程序集中不会有任何MSIL。但它仍然是一个类型,因此它将像任何类型一样出现在元数据中。创建元数据当然是编译器的工作。谢谢:)我明白了。刚刚在上玩了一玩,似乎接口被编译成类。继承类和继承接口的区别在于,它们是使用类的“extends”关键字和接口的“implement”关键字继承的。我现在的理解是,它们实际上被编译成类,只是语言限制了这些类的实例化。谢谢:)我明白了。刚刚在上玩了一玩,似乎接口被编译成类。继承类和继承接口的区别在于,它们是使用类的“extends”关键字和接口的“implement”关键字继承的。我现在的理解是,它们实际上被编译成类,只是语言限制了这些类的实例化。