目前,我有一个静态的工厂方法是这样的:使用Dictionary来映射工厂方法与匿名函数/委托以加快查找速度?
public static Book Create(BookCode code) {
if (code == BookCode.Harry) return new Book(BookResource.Harry);
if (code == BookCode.Julian) return new Book(BookResource.Julian);
// etc.
}
我不缓存它们以任何方式的原因是因为BookResource是文化,它可在两个电话之间切换敏感。文化的变化需要反映在返回的书籍对象中。
做这些if语句是可能的速度瓶颈。但是如果我们将图书代码映射到匿名函数/代表呢?类似以下内容:
delegate Book Create();
private static Dictionary<BookCode, Delegate> ctorsByCode = new Dictionary<BookCode, Delegate>();
// Set the following somewhere
// not working!
ctorsByCode[BookCode.Harry] = Create() => { return new Book(BookResource.Harry); }
// not working!
ctorsByCode[BookCode.Julian] = Create() => { return new Book(BookResource.Julian); }
public static Book Create(BookCode code) {
return (Book)ctorsByCode[code].DynamicInvoke(null);
}
我怎么能让那些Create() => {
行实际工作?
这是否值得速度明智,当有< 50书的代码(因此< 50 if语句)?
这是一个类似的问题,但遗憾的是笔者并不IFS VS代表发表他的代码Enum, Delegate Dictionary collection where delegate points to an overloaded method
更新
做了一些性能基准。我随机选取了单元代码,并为这两种方法使用了相同的种子。代表版本实际上稍慢。这些代表正在造成某种开销。我使用发布版本运行。
5000000 iterations
CreateFromCodeIf ~ 9780ms
CreateFromCodeDelegate ~ 9990ms
你是否有招聘?一小时收取多少钱? :D伟大的解决方案。我喜欢它比Keltex更紧凑。替代解决方案其实非常好。 – randomguy 2010-08-29 02:14:04
对于上述两种方法,我都得到了“代理”System.Action'不带0个参数“。 –
randomguy
2010-08-29 02:24:18
@randomguy:将其更改为'Func';抱歉。 – SLaks 2010-08-29 02:42:49