[英]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.Item1
, population.Item2
,...来访问它们
在某些语言中,几乎所有东西都可以用作价值。
举一个例子,Scheme。 Scheme是一种函数式语言,(几乎)Scheme中的所有东西都是函数而不是值。
通过包含Linq,C#现在已成为部分功能语言。
所以你寻找的等价物是Linq查询和lambda函数。 如果这还不够,请看一下F#。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.