2010-10-30 106 views
3

我一直在研究一些不同库的代码,并注意到有些将在同一个类中提供等价的泛型和非泛型函数。为什么使用泛型和非泛型函数变体?

一个例子是Common Service Locator项目的IServiceLocator接口:

public interface IServiceLocator 
{ 
    object GetInstance(Type serviceType); 
    object GetInstance(Type serviceType, string key); 
    IEnumerable<object> GetAllInstances(Type serviceType); 

    TService GetInstance<TService>(); 
    TService GetInstance<TService>(string key); 
    IEnumerable<TService> GetAllInstances<TService>(); 

} 

我得到的印象是,这是从COM最大化交通方便,也许。没有这些担忧,这似乎是冗余代码。有什么我失踪?

回答

2

大概是因为泛型类型是语法好,用户会喜欢它,因为它可以将其转换为正确的类型,但是,例如,如果该类型在运行时使用反射抬起头来,你不能使用通用选项,并需要使用一个类型。

此外,泛型总是在编译时解决。当你知道编译时的类型时,可以把它看作使用通用的类型,而在运行时则是非泛型的。

6

有时候,你知道你需要在编译时的类型,此时仿制药可以给你编译时的安全和整洁的代码。

有时你只知道你需要在执行时的类型,此时仿制药成为颈部疼痛,因为你需要通过反射给他们打电话。

提供这两个选项可以灵活地处理这两种情况。

0

的原因是,非通用将利用检查其类型隐含泛型,这样你就不必提类型。

相关问题