【问题标题】:How to call anonymous function in C#?如何在 C# 中调用匿名函数?
【发布时间】:2010-10-13 12:57:25
【问题描述】:

如果可以使用 C# 编写类似于此 Javascript 的代码,我很感兴趣:

var v = (function()
{
    return "some value";
})()

我能做到的最多是:

Func<string> vf = () =>
{
    return "some value";
};

var v = vf();

但我想要这样的东西:

// Gives error CS0149: Method name expected
var v = (() =>
{
    return "some value";
})();

有什么方法可以匿名调用函数吗?

【问题讨论】:

  • 你能准确地说出你想对代码做什么吗?期望的输入和输出是什么?
  • @Ahmad:这个问题非常清楚和明确。
  • 你能解释一下你为什么要这样做吗?当您可以简单地将匿名函数的主体放在那里并在代码运行时调用它时,为什么还要经历定义匿名函数和调用它的所有繁琐步骤?
  • @Eric Lippert:我在 ASP.NET 构造中以这种方式使用它。
  • @Alexander:很有趣。因此,您所做的实际上是在需要 expression 的上下文中使用一堆 statements。有没有什么方法可以运行语句而不必跳过这些圈子?

标签: c# anonymous-function


【解决方案1】:

是的,但是 C# 是静态类型的,所以你需要指定一个委托类型。

例如,使用构造函数语法:

var v = new Func<string>(() =>
{
    return "some value";
})();

// shorter version
var v = new Func<string>(() => "some value")();

... 或强制转换语法,它可能会因括号太多而变得混乱 :)

var v = ((Func<string>) (() =>
{
    return "some value";
}))();

// shorter version
var v = ((Func<string>)(() => "some value"))();

【讨论】:

  • 非常感谢!我应该自己猜。
  • 我猜那不可能使用匿名类型或 Linq 表达式? (考虑() =&gt; new { "test" } - 你能按字面意思称呼它吗?)
  • @NetMage 不,但是您可以声明一个通用方法,该方法接受 lambda 并简单地返回它 (static Func&lt;T&gt; Lambda&lt;T&gt;(Func&lt;T&gt; func) =&gt; func),然后调用它 (Lambda(() =&gt; new { Foo = "Test" })())。不幸的是,您需要为每个唯一数量的 lambda 参数单独重载。
  • 这让我可以调用我只需要调用一次的重要代码,并将其存储在一个变量中:int width = new Func&lt;int&gt;(() =&gt; { stmt; stmt; stmt; return something; }).Invoke();
【解决方案2】:

下面是你如何利用这样的结构来封闭上下文 - 闭包 -

Control.Click += new Func<string, EventHandler>((x) =>
new System.EventHandler(delegate(object sender, EventArgs e)
{

}))(valueForX);

【讨论】:

  • 这远远超出了您的需要。
  • 对不需要是函数的函数的浪费、冗余调用。听起来您来自 JS 背景;这在 JS 中是必需的,只是因为变量的作用域是 JS 中的整个函数。 C# 有正确的范围,所以这不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多