簡體   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