题
我读加速C#我真的不明白下面的代码:
public static Func<TArg1, TResult> Bind2nd<TArg1, TArg2, TResult> (
this Func<TArg1, TArg2, TResult> func,
TArg2 constant )
{
return (x) => func( x, constant );
}
在最后一行是什么X指什么?并且还有另一个:
public static Func<TArg2, Func<TArg1, TResult>> Bind2nd<TArg1, TArg2, TResult>
( this Func<TArg1, TArg2, TResult> func )
{
return (y) => (x) => func( x, y );
}
我如何评价? (y) => (x) => func( x, y )
什么传递哪里...它混淆。
解决方案
让我们首先简化的代码:
Func<int, int> B(Func<int, int, int> f, int c)
{
return x=>f(x, c);
}
这是一样的为:
class Locals
{
public int c;
public Func<int, int, int> f;
public int Magic(int x) { return f(x, c); }
}
Func<int, int> B(Func<int, int, int> f, int c)
{
Locals locals = new Locals();
locals.f = f;
locals.c = c;
return locals.Magic;
}
现在是明确哪些x指? x是参数函数“魔术师”。
现在可以使用乙这样的:
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, int> addTen = B(adder, 10);
int thirty = addTen(20);
有意义吗?见这里发生了什么?我们采取两个参数的功能和参数,以恒定的“固定”之一。因此它成为一个参数的函数。
第二个示例接受那一步。再次,简化摆脱克鲁夫特的,这样就可以更容易地理解它:
Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
return y=>x=>f(x,y);
}
这是相同的
class Locals3
{
public int y;
public int Magic3(int x)
{
return x + this.y;
}
}
class Locals2
{
public Func<int, int, int> f;
public Func<int, int> Magic2(int y)
{
Locals3 locals = new Locals3;
locals.y = y;
return locals.Magic3;
}
}
Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
Locals2 locals = new Locals2();
locals.f = f;
return locals.Magic2;
}
所以你说
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, Func<int, int>> makeFixedAdder = B2(adder);
Func<int, int> add10 = makeFixedAdder(10);
int thirty = add10(20);
B是一个参数定影剂。 B2 使一个参数定影液为你
然而,这不是点的B2。 B2的一点是:
adder(20, 10);
给出了相同的结果
B2(adder)(20)(10)
B2 匝的两个参数一个功能为一体的两个函数参数的每个
有意义吗?
其他提示
x是拉姆达的参数,它是类型TArg1的。
它可以是有帮助的发音的=>为“映射到”如在“X映射到与类型TArg2代入原始功能委托,FUNC的恒定一个新的功能。”
变量x是一个未绑定变量。其表示从主叫Bind2nd
一个参数返回的函数。
与方案A几个小时将帮助你在这里,但试试这个。
当你调用Bind2nd
返回的结果是一个函数。该函数被定义为
(x) => func (x, constant)
现在你已经在上述分配给一个变量,可以说lambda
,可以调用通过lambda
变量函数
lambda(x);
在x
定义的Bind2nd
就是这样表示的参数将被返回给您的函数的变量。
一个lambda表达式为匿名方法的简写。像匿名方法,lambda表达式被分配给委托类型。该申请匿名方法所有条件也适用于lambda表达式。
=>被称作拉姆达运营商,这被读作“变为”。操作者的左侧指定输入参数分离由逗号和右侧指定表达式或语句块被称作拉姆达体。 (P1,P2,P3,...,PN)=>表达式如果只有一个参数则可以跳过括号P1 =>表达;
我已经写了一个小博客这里说明 Lambda表达式lambda表达式