我不确定是否想得太多,但在过去,当声明一个类时,我会这样做:
IMyService myService = new MyService();
点击进入myService
将会带你到IMyService
接口。
然而,执行以下操作会(显然)带你到MyService
。
var myService = new MyService();
哪种用法被认为是“正确”的,还是这只是另一个例子“你最喜欢的冰激凌口味是什么?”?
我看了最相关的问题,但它并没有真正回答我的情况。
我不确定是否想得太多,但在过去,当声明一个类时,我会这样做:
IMyService myService = new MyService();
点击进入myService
将会带你到IMyService
接口。
然而,执行以下操作会(显然)带你到MyService
。
var myService = new MyService();
哪种用法被认为是“正确”的,还是这只是另一个例子“你最喜欢的冰激凌口味是什么?”?
我看了最相关的问题,但它并没有真正回答我的情况。
还有这个选项...
var myService = new MyService() as IMyService;
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
类的所有公共方法和属性。