使用var进行类型声明,而不是显式设置接口类型

本文关键字:接口类型 设置 var 类型 声明 使用 | 更新日期: 2023-09-27 18:09:39

我不确定我是否想得太多了,但在过去,我在声明类时做过这样的事情:

IMyService myService = new MyService();

进入myService将带您进入IMyService界面。

然而,这样做将(显然)带你到MyService

var myService = new MyService();

这被认为是"正确的"用法,或者这是"你最喜欢的冰淇淋口味?"的另一个例子?

我已经看了最相关的问题,但它并没有真正回答我的问题。

使用var进行类型声明,而不是显式设置接口类型

还有这个选项…

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,否则它没什么用处。在这种情况下,你必须把它定义为一个接口。