В настоящее время у меня есть статический фабричный метод, подобный этому:
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)? </p>
Это аналогичный вопрос, но, к сожалению, автор не публикует свой код Enum, коллекция словаря делегатов, где делегат указывает на перегруженный метод
Обновление
Сделал некоторые тесты производительности, если против делегатов. Я выбрал код единицы случайным образом и использовал одинаковое начальное число для обоих методов. Версия делегата на самом деле немного медленнее. Эти делегаты вызывают какие-то накладные расходы. Я использовал релизные сборки для прогонов.
5000000 iterations
CreateFromCodeIf ~ 9780ms
CreateFromCodeDelegate ~ 9990ms