Lazy<T>
1、Fun<T>
static Func<int> Add(int x, int y) { Console.WriteLine("调用 LazyAdd"); return () => { Console.WriteLine("执行 LazyAdd"); return x + y; }; }
var lazyAdd = Add(1, 2); Console.WriteLine("显示 LazyAdd"); Console.WriteLine(lazyAdd()); Console.WriteLine(lazyAdd());
2、Lazy<T>
static Lazy<int> LazyAdd(int x, int y) { Console.WriteLine("调用 LazyAdd"); return new Lazy<int>(() => { Console.WriteLine("执行 LazyAdd"); return x + y; }); }
var lazyAdd = LazyAdd(1, 2); Console.WriteLine("显示 LazyAdd"); Console.WriteLine(lazyAdd.Value); Console.WriteLine(lazyAdd.Value);
和Fun<T>差别,少了第二次”执行LazyAdd“
3、Func<int>
static int value = 10; static void Main(string[] args) { var lazyAdd = Add(1, 2); Console.WriteLine("显示 Add"); Console.WriteLine(lazyAdd()); value = 11; Console.WriteLine(lazyAdd()); Console.Read(); } static Func<int> Add(int x, int y) { Console.WriteLine("调用 Add"); return () => { Console.WriteLine("执行 Add"); return x + y + value; }; }
4、延迟加载缓存,不在执行第二次
static int value = 10; static void Main(string[] args) { var lazyAdd = LazyAdd(1, 2); Console.WriteLine("显示 LazyAdd"); Console.WriteLine(lazyAdd.Value); value = 11; Console.WriteLine(lazyAdd.Value); Console.Read(); } static Lazy<int> LazyAdd(int x, int y) { Console.WriteLine("调用 LazyAdd"); return new Lazy<int>(() => { Console.WriteLine("执行 LazyAdd"); return x + y + value; }); }
为什么Func<int>第二次会执行内部函数,而Lazy<int>第二次不会执行内部函数