标签:style blog http io color os ar 使用 for
delegate int Transformer(int i);
可以指定和调用下面的x=>x*x lambda表达式:
编译器内部将这种lambda表达式编译成一个私有方法,并把表达式代码移到该方法中.
Transformer sqr=x=>x*x; Console,WriteLine(sqr(3)); //9
(参数)=>表达式或语句块
在只有一个可推测类型的参数的时候,可以省略小括号.
上面例子中,只有一个参数x,表达式为x*x:
x=>x*x;
上面例子中,x和参数i一致,表达式x*x和返回值类型int一致,因此与Transformer委托相兼容
x=>{return x*x;};
Func<int,int>sqr=x=>x*x;
带两个参数的表达式
Func<string,string,int>totalLength=(s1,s2)=>s1.Length+s2.Length; int total=totalLength("Hello","world");//total=10;
Func<int,int>sqr=x=>x*x;
编译器可以推断出x是int类型,也可以显示的指定x的类型:
Func<int,int>=(int x)=>x*x;
static void Main(string[] args) { int factor = 2; Func<int, int> multiplier = n => n * factor; Console.WriteLine(multiplier(3)); Console.ReadKey(); }
结果为6.
static void Main(string[] args) { int factor = 2; Func<int, int> multiplier = n => n * factor; Console.WriteLine(multiplier(3));//6 factor = 10; Console.WriteLine(multiplier(3));//30 Console.ReadKey(); }
Lambda表达式可以自动更新捕获变量;
int seed = 2; Func<int> natural = () => seed++; Console.WriteLine(natural());//0 Console.WriteLine(natural());//1 Console.WriteLine(natural());//2
捕获变量的生命周期可以和委托的生命周期相同.以下例子中,局部变量seed本应在Natural执行完后消失,但是因为被捕获了,则,它的生命周期延长到和捕获它的委托natural的生命周期相同:
static void Main(string[] args) { Func<int> natural = Natural(); Console.WriteLine(natural());//0 Console.WriteLine(natural());//1 } static Func<int>Natural() { int seed = 0; return () => seed++;//返回一个闭包 }
static void Main(string[] args) { Func<int> natural = Natural(); Console.WriteLine(natural());//0 Console.WriteLine(natural());//0 } static Func<int>Natural() { return () => { int seed = 0; return seed++; };//返回一个闭包 }
Action[] actions = new Action[3]; for (int i = 0; i < 3; i++) { actions[i] = () => Console.Write(i); } foreach (var item in actions) { item();//结果输出333,而不是012 } Console.ReadKey();
每个闭包(Console.Write(i))捕获相同的变量,(如果变量i在循环中保持不变,则非常有用;甚至可以根据需要在循环体中显示修改i的值.),每个委托在调用的时候才看到i值,此时,i值为3(循环完成的最后值)
Action[] actions = new Action[3]; int i = 0; actions[0] = () => Console.Write(i); i = 1; actions[1] = () => Console.Write(i); i = 2; actions[2] = () => Console.Write(i); i = 3; //item调用的时候捕获最后一次i的值 foreach (var item in actions) item();//333
想要输出012,
Action[] actions = new Action[3]; for (int i = 0; i < 3; i++) { int lo = i; actions[i] = () => Console.Write(lo); } foreach (var item in actions)item();//012
这样导致闭包每次循环中捕获不同的变量
标签:style blog http io color os ar 使用 for
原文地址:http://www.cnblogs.com/valiant1882331/p/4059489.html