在某些语言中,几乎所有内容都可以用作值。例如,某些语言使您可以将代码块视为可以返回值的单元。

在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#中的“块值”吗?

最佳答案

抱歉,起初我似乎误解了您的问题,但似乎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,...访问它们

关于c# - 与其他语言的“块值”的C#等效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8280165/

10-10 14:33