Jon*_*eet 10

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

相反的成员是真实的IFoo,其与实现显式接口实现Foo.这是相对罕见的,但它确实发生了.

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

foo = new SomeOtherIFooImplementation();
Run Code Online (Sandbox Code Playgroud)

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

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

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

DoSomething(foo);
Run Code Online (Sandbox Code Playgroud)

根据是否foo声明为Foo或可以调用不同的方法IFoo.

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

  • 我想补充说,已经在Foo中显式实现的IFoo的任何成员在第二个声明中都不可见,但在第一个声明中是可见的. (4认同)