[英]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.