IFoo foo = new Foo()和Foo foo = new Foo()之间的区别是什么?

时间:2009-11-01 19:49:37

标签: c# .net interface

public class Foo : IFoo
...

之间有什么区别
IFoo foo = new Foo();

Foo foo = new Foo();

3 个答案:

答案 0 :(得分:10)

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

IFoo的{​​{1}}成员在Foo中使用explicit interface implementation实施的情况正好相反。 相对罕见,但确实发生了。

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

foo = new SomeOtherIFooImplementation();

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

通常,对接口而不是特定实现进行编码是有利的。这意味着编译器将阻止您使用特定于实现的细节,这反过来意味着将来可能更容易更改为不同的实现。

变量的类型也会影响重载决策:

DoSomething(foo);

可能会调用不同的方法,具体取决于fooFoo还是IFoo

基本上,变量的编译时类型在各种方面都很重要 - 实际上每次使用变量时,该代码含义的某些方面将取决于变量的类型。

答案 1 :(得分:1)

如果foo的类型为IFoo,而Foo实现的方法或属性未在IFoo中定义,除非将foo转换为Foo,否则无法访问它们。

如果foo的类型为IFoo,则可以实例化其他类型,这些类型也会从IFoo中包含并将其分配给foo。它更抽象,所以你不是特别依赖于Foo类型。

答案 2 :(得分:0)

第一个例子是实现IFoo的某个对象的实例。 第二个例子是Foo对象的一个​​实例。