目前,我有一个像这样的静态工厂方法:
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 语句)时,这在速度方面值得吗?
这是一个类似的问题,但不幸的是,作者没有发布他的代码Enum,Delegate Dictionary collection where delegate 指向一个重载的方法
更新
做了一些性能基准 ifs vs delegates。我随机选择了单元代码,并为这两种方法使用了相同的种子。委托版本实际上稍微慢一些。这些代表正在造成某种开销。我使用发布版本进行运行。
5000000 iterations
CreateFromCodeIf ~ 9780ms
CreateFromCodeDelegate ~ 9990ms