在其他语言的“块值”的C#中等效

时间:2011-11-26 17:19:29

标签: c#

在某些语言中,几乎所有东西都可以用作值。例如,某些语言允许您将代码块视为可以返回值的单位。

在Scheme中,包含在let中的代码块可以返回值:

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

Perl 5还支持块作为值:

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

我在C#中可以提出的块值的最接近的近似值是使用一个被转换并立即调用的lambda:

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

这不是太糟糕,实际上正是在语义上与Scheme发生的事情; let转换为应用的lambda。在这一点上,我不介意用C#中的宏来清理语法杂乱。

是否有另一种方法可以在C#中获取“块值”?

2 个答案:

答案 0 :(得分:1)

抱歉,起初我似乎误解了你的问题,但似乎delegates(如你的问题中)正是你正在寻找的不是吗?如果您有兴趣快速将一组不同的值组合在一起,而不一定是逻辑,那么我以前的答案仍然适用。


C#支持anonymous types

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

引入了var关键字,因此您无需指定类型名称。

之后您可以按如下方式访问成员:

Console.WriteLine( v.Amount );

自C#4.0以来的另一个解决方案是使用Tuples,它基本上将一组未命名的值组合在一起。

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

您必须使用population.Item1population.Item2,...

访问它们

答案 1 :(得分:1)

  

在某些语言中,几乎所有东西都可以用作值。

您举一个例子,Scheme。 Scheme是一种功能语言,(几乎)Scheme中的所有内容都是函数而不是值。

通过包含Linq,C#现在已成为部分功能语言。

所以你寻找的等价物是Linq查询和lambda函数。如果这还不够,请看看F#。