C# 从编译器/CLR的角度来看,接口和具体实例之间有什么区别?

C# 从编译器/CLR的角度来看,接口和具体实例之间有什么区别?,c#,oop,clr,C#,Oop,Clr,我理解接口是一种抽象类型,它不包含数据,但公开行为和属性,并且对象的实例是内存中存在的对象的引用或副本 我想知道编译器/底层代码如何处理这两个方面的差异?基于这个问题的答案,如果我将接口作为依赖项传递给对象而不是具体实例,那么为什么代码的耦合更松散?如果我将接口中定义的DoSomething方法调用到MyClass而不是MyClass的具体实例中定义的DoSomething方法,会发生什么不同?一个接口或抽象类可以有许多实现(具体实例) 通常,您应该定义接受类层次结构和接口而不是具体类的方法,以

我理解接口是一种抽象类型,它不包含数据,但公开行为和属性,并且对象的实例是内存中存在的对象的引用或副本


我想知道编译器/底层代码如何处理这两个方面的差异?基于这个问题的答案,如果我将接口作为依赖项传递给对象而不是具体实例,那么为什么代码的耦合更松散?如果我将接口中定义的
DoSomething
方法调用到
MyClass
而不是
MyClass
的具体实例中定义的
DoSomething
方法,会发生什么不同?

一个接口或抽象类可以有许多实现(具体实例)

通常,您应该定义接受类层次结构和接口而不是具体类的方法,以便它们是泛型的,并且不必为您定义的每个新实现重写它们


在基类或派生类中调用该方法应调用相同的方法,前提是您正确地重写了该方法。

一个接口或抽象类可以有许多实现(具体实例)

通常,您应该定义接受类层次结构和接口而不是具体类的方法,以便它们是泛型的,并且不必为您定义的每个新实现重写它们


在基类或派生类中调用该方法应调用相同的方法,前提是您正确地重写了该方法。

请参阅MSDN杂志文章:了解实现细节。

我认为运行时需要支持接口的主要原因尤其与以下事实有关:具有不同编译时间的程序集可能在运行时相互连接。

请参阅MSDN杂志文章:了解实现细节。

我认为运行时需要支持接口的主要原因尤其与这样一个事实有关,即具有不同编译时间的程序集可能在运行时相互连接。

我知道您说过您理解接口是什么,但我确实想知道,鉴于您将第二个问题与第一。第二个问题可以在不了解第一个问题的情况下得到回答,也不受第一个问题的任何影响

特别是在为什么它更松散耦合的问题上,它与编译器的实现或任何东西都没有关系:它只是软件架构

接口对实现类型没有任何限制,除了方法/属性的存在(从技术上讲,它们也是方法)

实现甚至不必在类型本身上公开,类型也不必有特定的构造函数等。更重要的是,它甚至不必是类。还有一个(相当边缘的情况)是,对于接口,一种类型可以有同一接口的多个实现

一旦使用基类,就可能会引入大量其他限制


诚然,这显然也是一件好事——例如,如果已知的混凝土基础是不可变的(为了一致性),并且它的构造函数中不允许“null”等(所有这些都不能通过接口执行).

我知道你说过你理解什么是接口,但考虑到你将第二个问题与第一个问题联系起来的方式,我想知道这是否完全正确。第二个问题可以在不了解第一个问题的情况下得到回答,也不受第一个问题的任何影响

特别是在为什么它更松散耦合的问题上,它与编译器的实现或任何东西都没有关系:它只是软件架构

接口对实现类型没有任何限制,除了方法/属性的存在(从技术上讲,它们也是方法)

实现甚至不必在类型本身上公开,类型也不必有特定的构造函数等。更重要的是,它甚至不必是类。还有一个(相当边缘的情况)是,对于接口,一种类型可以有同一接口的多个实现

一旦使用基类,就可能会引入大量其他限制


诚然,这些显然也是一件好事——例如,如果已知的混凝土基础是不可变的(为了一致性),并且它的构造函数中不允许“null”(所有这些都不可通过接口执行)。

我想你的问题在这里得到了很好的回答:@MichalB.:我不太确定。这只是解释了接口以及如何使用它们/它们如何有用。它没有提到CLR/编译器。有关一些背景知识,请参阅此问题的最佳答案:。(第二个链接在谷歌上搜索
接口实现CLR
)我想你的问题在这里得到了很好的回答:@MichalB.:我不太确定。这只是解释了接口以及如何使用它们/它们如何有用。它没有提到CLR/编译器。有关一些背景知识,请参阅此问题的最佳答案:。(第二个链接谷歌搜索
接口实现CLR
)问题的可能重复之处在于CLR如何处理差异,而不是差异是什么。问题在于CLR如何处理差异,而不是差异是什么。