代码之家  ›  专栏  ›  技术社区  ›  Barbaros Alp

ifoo foo=new foo()和foo foo=new foo()的区别是什么?

  •  1
  • Barbaros Alp  · 技术社区  · 16 年前
    public class Foo : IFoo
    ...
    

    两者有什么区别

    IFoo foo = new Foo();
    

    Foo foo = new Foo();
    
    3 回复  |  直到 16 年前
        1
  •  10
  •   Jon Skeet    16 年前

    差异仅在于声明的变量类型。然后每当使用表达式时,编译器都将使用该类型 foo . 例如,假设 Foo 类包含一些方法, 不是 在里面 IFoo . 在第一个声明中,该成员将不可见-您必须强制 键入 叫它。在第二个声明中,您可以直接访问它。

    相反,对于 IFOO 它是用 explicit interface implementation 在里面 .这是 相当地 很少,但确实发生了。

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

    foo = new SomeOtherIFooImplementation();
    

    而对于第二个声明,只能分配与 -也就是说, 或派生类。(当然,在这两种情况下,您都可以将变量设置为空。)

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

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

    DoSomething(foo);
    

    根据是否调用不同的方法 被宣布为 IFOO .

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

        2
  •  1
  •   Jeremy    16 年前

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

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

        3
  •  0
  •   LJM Tim Schmelter    16 年前

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