繁体   English   中英

这种C#语法的用途是什么,似乎正在使用匿名函数和javascript样式属性设置

[英]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));

您对第一部分是正确的; () => ...表示不带参数的匿名函数。

您感到困惑的第二部分称为命名参数 就像任何其他函数调用一样,不同之处在于代码明确指出了哪个参数属于哪个参数。

Sku和Price被命名为参数 ,()=>是lambda表达式 而且ShapeHelper大概是动态类型

第二个参数是一个匿名的无参数函数,该函数返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM