c# - IFoo foo = new Foo() 和 Foo foo = new Foo() 有什么区别

标签 c# .net interface

public class Foo : IFoo
...

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


Foo foo = new Foo();

最佳答案

区别仅在于变量的声明类型。每当您使用表达式 foo 时,编译器都会使用该类型。 .例如,假设 Foo类包含一些不在 IFoo 中的方法.使用第一个声明,该成员将不可见-您必须强制转换 foo输入 Foo调用它。在第二个声明中,您可以直接访问它。
IFoo 的成员则相反。使用 explicit interface implementation 实现在 Foo .这种情况比较少见,但确实会发生。

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

foo = new SomeOtherIFooImplementation();

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

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

变量的类型也会影响诸如重载决议之类的事情:
DoSomething(foo);

可能会根据 foo 是否调用不同的方法声明为 FooIFoo .

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

关于c# - IFoo foo = new Foo() 和 Foo foo = new Foo() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658140/

相关文章:

c# - DataGridView 中的数据关系

c# - 为什么会发生 CLR 异常 FatalExecutionEngineError?

c# - 需要UAC protected 资源的完整列表才能以标准用户身份运行我的应用程序(未提升)

.net - “Clickable”文字区 block ?

ios - 如何使 Xcode 自动符合协议(protocol)

java - 如何将接口(interface)设为私有(private)但在两个类之间使用?

c# - LINQ to Entities 无法识别方法 'System.String ToString(Int32)' 方法,并且无法将此方法翻译成存储表达式

c# - 您可以通过 App.config 文件更改 C# Winforms 按钮的名称吗?

javascript - 无法分配给对象 'property' 的只读属性 '#<Object>'

c# - Azure 上具有 ClickOnce 应用程序的 Asp.net MVC 网站