使用var进行类型声明,而不是显式设置接口类型
本文关键字:接口类型 设置 var 类型 声明 使用 | 更新日期: 2023-09-27 18:09:39
我不确定我是否想得太多了,但在过去,我在声明类时做过这样的事情:
IMyService myService = new MyService();
进入myService
将带您进入IMyService
界面。
然而,这样做将(显然)带你到MyService
。
var myService = new MyService();
这被认为是"正确的"用法,或者这是"你最喜欢的冰淇淋口味?"的另一个例子?
我已经看了最相关的问题,但它并没有真正回答我的问题。
还有这个选项…
var myService = new MyService() as IMyService;
这将使var myVar = IMyService type…然后你可以在其他代码中做一些像…
if(myVar is MyService)
{
//instance specific stuff
}
看情况。您的MyService
类的所有公共成员都(完全)来自IMyService
接口的实现吗?或者有一些额外的公共成员(可能来自另一个接口的实现)?如果是这样,第二种"风格"将允许您看到这些额外的成员,而第一种则不允许。
另一方面,如果你正在使用接口,我会说"正确"的用法是从依赖注入引擎或从某种工厂类或方法中获得类型实例,但我想这超出了这个问题的范围。
您希望myService
是什么类型?您希望它是IMyService
引用还是MyService
引用?一旦你做了那个决定,其余的就会随之而来。
换句话说,只有你能回答这个问题。
这取决于你所说的正确用法。在一个接口的例子中,你正在创建一个MyService
类的对象,并将其存储到IMyService
类的"指针"中。所以你的对象实际上是MyService
的一个实例,但是你的myService
变量把它当作IMyService
接口。因此,您将无法调用MyService
的任何方法/访问IMyService
之外的任何属性。
对于var
示例,您只是告诉编译器从声明的右侧计算myService
变量的类型。所以,在这种情况下,它与MyService myService
完全相同,这意味着你可以通过myService
变量访问MyService类的所有公共方法和属性。
我想真正的问题是为什么要将myService定义为一个接口。除非你想给它分配其他的IMyService,否则它没什么用处。在这种情况下,你必须把它定义为一个接口。