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"]存的是字符串。

posted @ 2022-02-22 17:40  江境纣州  阅读(663)  评论(0编辑  收藏  举报