在某些语言中,几乎所有内容都可以用作值。例如,某些语言使您可以将代码块视为可以返回值的单元。
在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.Item1
,population.Item2
,...访问它们关于c# - 与其他语言的“块值”的C#等效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8280165/