关于c#:IFoo foo = new Foo()和Foo foo = new Foo()之间有什么区别?

What is the difference between IFoo foo = new Foo() and Foo foo = new Foo()

1
2
public class Foo : IFoo
...

两者有什么区别

1
IFoo foo = new Foo();

1
Foo foo = new Foo();


区别就在于变量的声明类型。然后,每当使用表达式foo时,编译器都将使用该类型。例如,假设foo类包含一些不在IFoo中的方法。在第一个声明中,该成员将不可见-您必须将foo强制转换为类型foo,才能调用它。在第二个声明中,您可以直接访问它。

相反,对于IFoo的成员是正确的,这些成员在foo中通过显式接口实现实现。这是相对罕见的,但确实发生了。

使用第一个声明,还可以将变量重新分配给对实现IFoo类型的任何其他对象的引用,例如。

1
foo = new SomeOtherIFooImplementation();

而对于第二个声明,您只能分配与foo兼容的值,即foo或派生类的实例。(当然,在这两种情况下,您都可以将变量设置为空。)

通常,将代码编写到接口而不是特定的实现是有利的。这意味着编译器将阻止您使用特定于实现的细节,而这又意味着将来更容易更改为其他实现。

变量的类型也会影响过载分辨率:

1
DoSomething(foo);

可以根据foo是声明为foo还是IFoo调用不同的方法。

基本上,变量的编译时类型在所有方面都很重要-几乎每次使用变量时,代码含义的某些方面都取决于变量的类型。


如果foo是ifoo类型,并且foo实现了ifoo中未定义的方法或属性,则除非将foo强制转换为foo,否则无法访问这些方法或属性。

如果foo是ifoo类型,则可以实例化其他类型,这些类型也从ifoo中插入,并将其分配给foo。它更抽象,所以您并不具体依赖于foo类型。


第一个例子是实现ifoo的某个对象的实例。第二个例子是一个foo对象的实例。