我有什么理由以某种方式访问​​一组泛型类型吗?

时间:2015-07-23 09:54:30

标签: c# generics

说我有以下内容:

public interface IFoo { }

public class Foo<T> : IFoo { ... }

我有什么理由选择使用其中一种模式吗?

两者都允许我实现我的目标,能够存储Foo<T>并通过T检索它们,但字典方法中的Type似乎相当多余,但是,可能List方法中的foreach循环效率低于从字典中获取的效果吗?

private Dictionary<Type, IFoo> foos = new Dictionary<Type, IFoo>();

public void AddFoo<T>(Foo<T> foo)
{
    foos.Add(typeof(T), foo);
}

public Foo<T> GetFoo<T>()
{
    if(foos.ContainsKey(typeof(T))
    {
         return (Foo<T>)foos[typeof(T)]; 
    }
}

private List<IFoo> foos = new List<IFoo>();

public void AddFoo<T>(Foo<T> foo)
{
    foos.Add(foo);
}

public Foo<T> GetFoo<T>()
{
    foreach(Foo foo in foos)
    {
        if(foo is Foo<T>)
        {
            return (Foo<T>)foo;
        }
    }
    return null;
}

1 个答案:

答案 0 :(得分:1)

您应该更喜欢第一个版本,但我更喜欢使用TryGetValue而不是ContainsKey + getter,所以:

public Foo<T> GetFoo<T>()
{
    Foo<T> foo;
    if(foos.TryGetValue(typeof(T), out foo)
    {
         return foo;
    }
    else return null;
}

Primarly,字典比O(n)更有效(可能在O(log(n))左右,但我不确定),当你有很多物品时,这一点非常重要。在低于10个条目的情况下,由于开销,它可能比使用列表更糟糕。

其次,它是更好的可读设计。无论谁需要阅读您的代码,都能更好地理解您的意思。