Func<T, R>
泛型作为参数和返回值
public static Func<T, R> Memoize<T, R>(Func<T, R> func) where T: IComparable { Dictionary<T, R> cache = new Dictionary<T, R>(); return arg => { if (cache.ContainsKey(arg)) return cache[arg]; return cache[arg] = func(arg); }; }
1、return cache[arg] = func(arg);
等价于cache[arg] = func(arg);
return cache[arg]
2、Dictionary<T, R> cache局部变量,每次调用都是一个局部变量,字典只有一个值?
static void Main(string[] args) { var getMemoize = Memoize<string, string>(GetString); Console.WriteLine(getMemoize("A")); Thread.Sleep(TimeSpan.FromSeconds(3)); Console.WriteLine(getMemoize("B")); Thread.Sleep(TimeSpan.FromSeconds(3)); Console.WriteLine(getMemoize("A")); var getMemoize1 = Memoize<string, string>(GetString); Thread.Sleep(TimeSpan.FromSeconds(3)); Console.WriteLine(getMemoize1("B")); Console.Read(); }
不是的,因为Memoize<string, string>(GetString);返回的的是一个方法,即getMemoize,对于得到的getMemoize而言,Dictionary<T, R> cache = new Dictionary<T, R>();就是一个全局变量
所以两次Console.WriteLine(getMemoize("A"));得到的值是一致的。但是Console.WriteLine(getMemoize("B"));和Console.WriteLine(getMemoize1("B"));是不一致的。
其实就是闭包:内层函数使用的参数是外层函数的局部变量时,编译器为这个变量创建一个闭包
3、为什么第二次getMemoize("A")返回的和第一次的DateTime.Now一致
因为第二次取得是cache["A"],而cache["A"]存的是字符串。