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

时间:2011-09-27 08:35:51

标签: c# variable-declaration

我不确定我是否在思考这个问题,但在过去,我在宣布上课时做了类似的事情:

IMyService myService = new MyService();

跳转到myService会转到IMyService界面。

但是,执行以下操作(显然)会将您带到MyService

var myService = new MyService();

哪个被认为是'正确'用法,或者是"What's your favourite ice cream flavor?"的另一个例子?

我看过most relevant question,但它并没有真正回答我的情况。

5 个答案:

答案 0 :(得分:2)

还有这个选项......

var myService = new MyService() as IMyService;

这将使var myVar = IMyService类型......然后你可以在其他代码中做类似的事情......

if(myVar is MyService)
{
    //instance specific stuff 
}

答案 1 :(得分:1)

嗯,这取决于。您MyService课程的所有公共成员是否(仅限)来自IMyService界面的实施?或者有一些额外的公共成员(可能来自另一个接口的实现)?如果是这样,第二个“味道”将允许你看到这些额外的成员,而第一个不会。

另一方面,如果您正在使用接口,我会说“正确”用法是从依赖注入引擎或某种工厂类或方法获取类型实例,但我想这不在范围之内这个问题。

答案 2 :(得分:1)

您希望myService是什么类型的?您希望它是IMyService引用还是MyService引用?一旦做出决定,其余的就会随之而来。

换句话说,只有你可以回答这个问题。

答案 3 :(得分:0)

这取决于您正确使用的含义。在带有接口的示例中,您将创建一个MyService类的对象,并将其存储到IMyService类的“指针”中。因此,您的对象ius实际上是MyService的实例,但您的myService var将其视为IMyService接口。因此,您将无法调用任何方法/访问MyService中不属于IMyService的任何属性。

使用var示例,您只是告诉编译器从声明的右侧计算myService变量的类型。因此,在这种情况下,它与MyService myService完全相同,这意味着您可以通过myService变量访问MyService类的所有公共方法和属性。

答案 4 :(得分:-1)

我认为真正的问题是为什么将myService定义为接口。除非您希望能够为其分配其他IMyService,否则它没什么用处。在这种情况下,您必须将其定义为接口。