2011-10-19 1 views
1

이것은 Orchard CMS codegen의 것입니다. 나는 이해하지 못하고 어떻게 아래의 코드가 문법 오류를 던지지 않는가? 주로 [parameter]:[Object]뿐만 아니라 () => 사용 [익명 함수 아마도]익명 함수 및 javascript 스타일 속성 설정을 사용하는 것처럼 보이는이 C# 구문의 목적은 무엇입니까

return ContentShape("Parts_Product", 
       () => shapeHelper.Parts_Product(
        Sku: part.Sku, 
        Price: part.Price)); 

답변

3

첫 번째 부분은 옳습니다. () => ...은 인수가없는 익명의 함수를 나타냅니다.

두 번째로 혼란스러운 부분은 named arguments입니다. 코드가 명시 적으로 어떤 인수가 어떤 매개 변수에 속하는지 명시한다는 점을 제외하고는 다른 모든 함수 호출과 같습니다.

+0

오. 나는 Sku = part라고 생각하고 있었다 .Sku는 작동해야하지만 그것은 클래스가 아니라 함수를 만드는 것이다. –

0
() => shapeHelper.Parts_Product(
        Sku: part.Sku, 
        Price: part.Price) 

람다 식을 사용하여 선언 된 익명의 대리인입니까?

1

두 번째 매개 변수는 shapeHelper.Parts_Product 메서드의 결과를 반환하는 익명의 매개 변수없는 함수입니다. 매개 변수로 전달 된 매핑 해시는 프로토 타입에 지정된 순서대로 전달하지 않고 매개 변수 값을 지정할 수 있습니다.

0

매개 변수없는 익명 기능입니다. 그냥 명명 된 인수를 사용하여 다른 메서드를 호출합니다. 여기 매개 변수 순서를 기억하기 어려울 수 있습니다

private void DoSomething(string param1, string param2="param2default", string param3); 

및 매개 변수의 일부는 선택 사양 일 수 있으며 당신이 그 값을 사용할 수 있습니다 : 당신은 같은 복잡한 서명이 때 편리하게되어 있습니다. 따라서 함수를 호출 할 때 다음과 같은 매개 변수 이름을 명시 적으로 명시해야합니다.

DoSomething(param1:"x", param3:"y"); 

선택적 매개 변수 및 명명 된 인수가 C# 4.0에서 제공됩니다.

1

여기의 비틀기는 셰이프 도우미가 사용자가 동적으로 호출하는 함수를 동적으로 결정하는 동적 개체라는 것입니다. 이 경우에는 Part_Product 메소드가 없으며 동적으로 처리됩니다. 이 아래의 프레임 워크 인 Clay는 Part_Product라는 모양을 만들고 메서드에 제공되는 명명 된 매개 변수로 지정된 속성을 사용하여이를 해석합니다. 본질적으로 이것은 동적 메서드와 명명 된 메서드 매개 변수에 대한 C# 구문을 사용하여 동적 개체를 만듭니다. 비교 점을 ​​제공하기 위해 Javascript의 해당 코드는 다음과 유사합니다.

return function() { 
    return { 
     Part_Product: { 
      Sku: part.Sku, 
      Price: part.Price 
     } 
    }; 
};