簡體   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