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

3

我不确定是否想得太多,但在过去,当声明一个类时,我会这样做:

IMyService myService = new MyService();

点击进入myService将会带你到IMyService接口。

然而,执行以下操作会(显然)带你到MyService

var myService = new MyService();

哪种用法被认为是“正确”的,还是这只是另一个例子“你最喜欢的冰激凌口味是什么?”

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


你的问题标题有误导性。你问是否将其声明为具体类型或接口。后者有其优点,但只有你知道它。 - nawfal
如果你觉得这有误导性,欢迎你将其改为更有意义的内容。然而,三年后我仍然认为它是有意义的... :| - Dan Atkinson
我没有编辑它,因为我担心原帖作者会觉得太过激烈。问题标题询问关于“var”的内容,但实质上问题(在正文中)更多地涉及具体类型与接口类型。所以我很困惑,不知道你是在寻找“var”的重要性还是想了解接口的重要性。如果你能澄清一下,我会进行编辑。并非吹毛求疵,只是想让SO变得更好。 - nawfal
@nawfal 不,那并不是我所问的,也不是我想知道的。 :) - Dan Atkinson
这是关于两种情况的询问,哪一个不是? - nawfal
5个回答

2

还有这个选项...

var myService = new MyService() as IMyService;

这将使变量myVar的类型为IMyService,然后在其他代码中可以这样做...
if(myVar is MyService)
{
    //instance specific stuff 
}

1

这要看情况。你的 MyService 类的所有公共成员都是(独占地)来自于 IMyService 接口的实现吗?还是有一些额外的公共成员(也许来自于另一个接口的实现)?如果是后者,第二种“风味”将允许你看到这些额外的成员,而第一种则不会。

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


你在从IOC获取类型实例方面是正确的。这是我在我的应用程序中担心的一件事情。 - Dan Atkinson

1
你希望myService是什么类型?你希望它是一个IMyService引用还是一个MyService引用?一旦你做出了这个决定,其余部分就会跟随。

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


0

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

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


-1
我想真正的问题是为什么你将myService定义为一个接口。除非你想要能够将其他IMyService分配给它,否则它没有太多用处。在这种情况下,你必须将其定义为一个接口。

接口的使用是多种多样的。例如,控制反转(IOC)和模拟测试(mocking)因为它们在一些答案中被提到。如果没有接口,做这些事情将会非常棘手。 - Dan Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接