c#自定义表达式变量(因为我没有更好的术语)

时间:2017-03-05 15:18:49

标签: c#

这在c#中被称为什么?那你怎么做/语法? 这被称为“内联函数”吗?

我是一个方法。 在这种方法中,我想重复使用相同的代码。也许你可以在其他语言中使用变量。

e.g。

// I have a bit of code to define an expression expl
line1: int x = 0;
line2: var expl = { x+=2 }
line3: ... use expl // x now =2
line4: ... use expl // x now =4
line5: ... use expl // x now =6
line6: ... ... do other things ...
line7: ... use expl
... and so it goes on

与上面的伪代码不同,我的表达式相当冗长,而且我不应该像我应该创建一个函数一样。在这个方法中,应用程序中唯一的位置(因为我目前缺少一个更好的术语)将永远不会被使用。

请理解我不是简单地尝试在我的生产表达式中添加2到x。我会使用x在每一行上执行此操作。在生产中expl实际上是一个五行三元表达式(我相信我在这种情况下正确地使用了术语表达式)所以我不会一遍又一遍地切断和过去相同的五行: - )

感谢。

2 个答案:

答案 0 :(得分:4)

int x = 0;
Action addTwo = () => x += 2;
addTwo();
addTwo();

Actiondelegate的特定形式,类似于内联函数。它使用在其自己的范围之外声明的变量的事实使它也成为闭包。使用.NET框架定义的其他delegate包括Action<>的各种通用形式(因此您可以将参数传递给它)和Func<>(因此您可以从中返回值) )。但是您也可以声明自己的命名委托,它具有您喜欢的任何方法签名。

上面的代码使用 lambda表达式 lambda语法,但您也可以更明确地声明它:

Action addTwo = delegate() { x += 2 };

尚未发布的C# 7 is expected to have Local Functions,基本上是相同的,但语法略有不同:

void AddTwo() => x += 2;

void AddTwo() { x += 2; }

答案 1 :(得分:2)

您正在寻找的术语是"anonymous function" or "lambda expression"

您要做的最简单的方法是使用Action<>Func<>通用委托类型。如果要返回值,请使用Func<>返回void use Action<>

在您的示例中,您可以像这样编写表达式行:

Func<int> expl = () => x += 2;

这将向x添加2并返回结果。