2011-11-26 2 views
3

일부 언어에서는 거의 모든 것을 값으로 사용할 수 있습니다. 예를 들어, 일부 언어는 코드 블록을 값을 반환 할 수있는 단위로 취급 할 수 있습니다. 반응식다른 언어의 "블록 값"에 해당하는 C#

가치 반환 수 let 래핑 코드 블록 :

my $val = do 
{ 
    my $a = 100; 
    my $b = 200; 
    my $c = $a + $b; 
    $c; 
}; 

가장 가까운 근사치 I 있었던 값을 차단할 :

(define val 
    (let() 
    (define a 10) 
    (define b 20) 
    (define c (+ a b)) 
    c)) 

펄 5는 값으로 블록 지지대 C#에서는 캐스팅되어 즉시 호출되는 람다를 사용하는 것이 었습니다.

var val = ((Func<int>)(() => 
{ 
    var a = 10; 
    var b = 20; 
    var c = a + b; 
    return c; 
}))(); 

그다지 나쁘지는 않으며 실제로 Scheme에서 의미 상으로 어떤 일이 일어나고 있는지 정확히 알 수 있습니다. let은 적용되는 lambda으로 변환됩니다. 이 시점에서 나는 C#의 매크로가 통어론을 깨끗이 정리하는 데 신경 쓰지 않을 것이다.

C#에서 "블록 값"을 얻는 또 다른 방법이 있습니까?

+0

무엇을하려고합니까? 일대일 매핑이 없을 수도 있습니다. 게다가, 나는 대표들이 당신이 찾고있는 것일지도 모른다라고 생각한다. –

+1

익명 메서드가 있지만 (http://msdn.microsoft.com/en-us/library/0yw3tz5k.aspx) 개인적으로 lambdas를 선호합니다. – FuleSnabel

답변

1

죄송합니다. 처음에는 질문을 잘못 읽은 것 같았지만 delegates (질문과 같이)이 정확히 찾고있는 대상이 아닙니다. 논리가 아닌 여러 값의 집합을 빠르게 그룹화하는 데 관심이 있다면 이전의 대답이 계속 적용됩니다.


C#은 anonymous types을 지원합니다.

var v = new { Amount = 108, Message = "Hello" }; 

var 키워드가 도입되어 유형 이름을 지정할 필요가 없습니다. 다음과 같이

그 후 당신은 멤버에 액세스 할 수 있습니다

Console.WriteLine(v.Amount); 

또 다른 해결책하는 기본적으로 그룹 이름 값의 집합 함께 Tuples를 사용하는 4.0 C# 때문이다.

var population = Tuple.Create(
    "New York", 7891957, 7781984, 
    7894862, 7071639, 7322564, 8008278); 

당신은 population.Item1, population.Item2 ... 일부 언어에서

+2

모든 형식 매개 변수에 대한 필요성을 없애기 위해 ['Tuple.Create()'] (http://msdn.microsoft.com/en-us/library/dd387145.aspx)를 사용하십시오. – BoltClock

+0

@BoltClock : Very 사실, 나는 msdn에서 붙여 넣기 만하면됩니다. :) –

1

는 거의 모든 것이 값으로 사용할 수있는 사용하여 액세스 할 수 있습니다.

당신은 Scheme을 예로들 수 있습니다. Scheme은 functional입니다. Scheme의 (거의) 모든 것이 값이 아닌 함수입니다.

이제 C#은 Linq를 포함하여 부분적으로 기능 언어입니다.

그래서 당신이 추구하는 등가물은 Linq 쿼리와 실제로 람다 함수입니다. 충분하지 않다면 F #을 살펴보십시오.