为什么使用泛型和非泛型函数变体?

时间:2010-10-30 21:46:24

标签: c# generics

我一直在研究一些不同库的代码,并注意到有些库会在同一个类中提供等效的泛型和非泛型函数。

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

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。没有这些顾虑,这似乎是多余的代码。有什么我想念的吗?

3 个答案:

答案 0 :(得分:6)

有时您在编译时知道所需的类型,此时泛型可以为您提供编译时安全性和更简洁的代码。

有时你只知道你在执行时需要的类型,此时泛型会变成一种痛苦,因为你需要通过反思来调用它们。

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

答案 1 :(得分:2)

可能是因为泛型类型对语法更好,用户会更喜欢它,因为它可以将它转换为正确的类型,但是例如,如果在运行时使用反射查找类型,则不能使用泛型选项,需要使用带有Type的那个。

此外,泛型总是在编译时解决。当你在编译时知道类型,并在运行时知道非泛型时,可以把它想象成使用泛型。

答案 2 :(得分:0)

原因是非Generic会通过检查其类型来使用隐含的泛型,这样您就不必提及类型。