[英]What is the purpose of this C# syntax which appears to be using anonymous functions and javascript style property setting
这是来自Orchard CMS代码源。 我不明白,下面的代码如何不引发语法错误。 主要是[parameter]:[Object]
以及() =>
[也许是一个匿名函数]
return ContentShape("Parts_Product",
() => shapeHelper.Parts_Product(
Sku: part.Sku,
Price: part.Price));
您对第一部分是正确的; () => ...
表示不带参数的匿名函数。
您感到困惑的第二部分称为命名参数 。 就像任何其他函数调用一样,不同之处在于代码明确指出了哪个参数属于哪个参数。
第二个参数是一个匿名的无参数函数,该函数返回shapeHelper.Parts_Product
方法的结果。 作为参数传递的映射哈希值可以指定参数值,而无需按照原型指定的顺序传递参数值。
这里的问题是形状帮助器是一个动态对象,该对象动态地决定如何对您在其上进行的函数调用进行处理。 在这种情况下,没有Part_Product方法,它是动态处理的。 Clay(位于此基础下的框架)将其解释为创建名为Part_Product的形状,并具有由提供给方法的命名参数指定的属性。 本质上,这劫持了用于动态方法和命名方法参数的C#语法以构建动态对象。 为了给您一个比较点,Javascript中的等效代码如下所示:
return function() {
return {
Part_Product: {
Sku: part.Sku,
Price: part.Price
}
};
};
() => shapeHelper.Parts_Product(
Sku: part.Sku,
Price: part.Price)
是使用Lambda表达式声明的匿名委托。
这是一个无参数的匿名函数。 它只是使用命名参数调用另一个方法。 当您具有以下复杂签名时,它会派上用场:
private void DoSomething(string param1, string param2="param2default", string param3);
在这里可能很难记住参数顺序,并且某些参数可能是可选的,您可能要使用这些值。 因此,在调用函数时,应明确声明这些参数名称,如下所示:
DoSomething(param1:"x", param3:"y");
C#4.0附带了可选参数和命名参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.