繁体   English   中英

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

[英]Equivalent in C# of “Block values” in other languages

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

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

对不起,起初我似乎误解了你的问题,但似乎代表 (如你的问题)正是你正在寻找的没有? 如果您有兴趣快速将一组不同的值组合在一起,而不一定是逻辑,我之前的答案仍然适用。


C#支持匿名类型

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 ,...来访问它们

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

举一个例子,Scheme。 Scheme是一种函数式语言,(几乎)Scheme中的所有东西都是函数而不是值。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM