说我有以下内容:
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;
}
答案 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个条目的情况下,由于开销,它可能比使用列表更糟糕。
其次,它是更好的可读设计。无论谁需要阅读您的代码,都能更好地理解您的意思。