デリゲートの最適化にもう1歩踏み込む
デリゲートの最適化についてはもう1歩踏み込んでみたいと思います。
下記のようなコードをビルドしてみると
/// <summary> /// string.IsNullOrWhiteSpace /// </summary> static Func<string, bool> stringIsNullOrWhiteSpace = string.IsNullOrWhiteSpace; static void Main(string[] args) { Where(stringIsNullOrWhiteSpace, "test"); Where(string.IsNullOrWhiteSpace, "test"); Where(x =>string.IsNullOrWhiteSpace(x), "test"); }
これがこのようになるというわけです。
private static Func<string, bool> stringIsNullOrWhiteSpace = new Func<string, bool>(string.IsNullOrWhiteSpace); private static void Main(string[] args) { Program.Where(Program.stringIsNullOrWhiteSpace, "test"); Program.Where(new Func<string, bool>(string.IsNullOrWhiteSpace), "test"); Func<string, bool> arg_4B_0; if ((arg_4B_0 = Program.<>c.<>9__1_0) == null) { arg_4B_0 = (Program.<>c.<>9__1_0 = new Func<string, bool>(Program.<>c.<>9.<Main>b__1_0)); } Program.Where(arg_4B_0, "test"); }
短い簡潔なラムダ式でしたら private static で外部に配置するのが最も良いコードに変換されるということです。
ただし、気を付けたいのはそもそもの「ラムダ式にしたい事情」というものは、例えばローカル変数へのスコープであったり他の様々な利点があってのことであるということです。
あと、delegate という単語は書きたくありません(ひっそりと本音)。
少し脱線しますが速いコードはGCが最も動かないコード・・・という原則ゆえかはわかりませんが、VS2015の診断ツールはGCが動いたタイミングをマーキングしてくれて少しうれしくなります。