現在、次のような静的ファクトリメソッドがあります。
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未満(つまり、ifステートメントが50未満)の場合、これは速度的に価値がありますか?
これも同様の質問ですが、残念ながら、作成者は自分のコードEnum、Delegate Dictionaryコレクションを投稿していません。ここで、delegateはオーバーロードされたメソッドを指しています。
アップデート
いくつかのパフォーマンスベンチマークifs対デリゲートを行いました。ユニットコードをランダムに選び、両方の方法で同じシードを使用しました。デリゲートバージョンは実際には少し遅いです。それらの代表者は、ある種のオーバーヘッドを引き起こしています。実行にはリリースビルドを使用しました。
5000000 iterations
CreateFromCodeIf ~ 9780ms
CreateFromCodeDelegate ~ 9990ms