在定义 lambda 表达式后立即执行该表达式
本文关键字:表达式 执行 定义 lambda | 更新日期: 2023-09-27 18:31:29
有没有办法在定义 lambda 表达式后立即执行它?
换句话说(无效的 C# 代码):
(() => { Console.WriteLine("Hello World"); }).Invoke();
当然。
new Action(() => { Console.WriteLine("Hello World"); })();
这应该可以解决问题。
另一个"选项",只是其他两个伪装略有不同的答案:
((Action)(() => { Console.WriteLine("Hello World"); }))();
原因,直接取自phoog的评论:
。您尚未告诉编译器是要
Action
还是Expression<Action>
。如果将该 lambda 表达式转换为Action
,您将能够对其调用 Invoke 或使用方法调用语法 () 来调用它。
不过它肯定会变得丑陋,而且我不知道这种形式在哪个地方有用,因为它不能在没有名称的情况下用于递归......
你应该能够做到这一点:
Action runMe = () => { Console.WriteLine("Hello World"); };
runMe();
下面是如何使用它的示例。您希望使用几行代码的结果初始化构造函数,这些代码无法编写为函数,因为这是第三方 API 的结构。
它只是胶水代码,以防止编写从未在其他任何地方调用的独立函数。我使用的是Func
而不是Action
,但答案与user166390相同。
// imagine several dozens of lines that look like this
// where the result is the return value of a function call
fields.Add(new ProbeField(){
Command = "A",
Field = "Average",
Value = be.GetAverage()
});
// now you need something that can't be expressed as function call
// so you wrap it in a lambda and immediately call it.
fields.Add(new ProbeField(){
Command = "C",
Field = "Cal Coeff",
Value = ((Func<string>)(() => {
CalCoef coef;
Param param;
be.GetCalibrationCoefficients(out coef, out param);
return coef.lowDet1.ToString();
}))()
});
对于我自己的项目,我有时会编写一个很小的可重用的辅助函数,以使立即调用的 lambda 的语法看起来更短。这个"Inv"的灵感来自LanguageExt库中类似的"fun"功能。
// Helper utility functions
public static void Inv(Action a) => a();
public static T Inv<T>(Func<T> f) => f();
private static void TestMethod()
{
// Action example
Inv(() => Console.WriteLine("Hello World!"));
// Func example with no parameters
bool result = Inv(() =>
{
if (1 == 1)
return true;
else
return false;
});
}
你也可以用其他一些重载来扩展它,以便你可以传入参数,但这些看起来更麻烦的语法,可能没有那么有用。
public static Func<A, T> Inv<A, T>(Func<A, T> f) => f;
public static Func<A, B, T> Inv<A, B, T>(Func<A, B, T> f) => f;
string printNumber = Inv((int number) => $"This is the number {number}")(5);
int addedNumbers = Inv((int x, int y) => x + y)(5, 6);
using System.Threading.Tasks;
using System.Threading;
Task.Run(()=>{
//do something
});
程序员真的很喜欢让事情变得比他们应该的更困难
您可以使用以下方法添加 500 毫秒的延迟
Task.Run(()=>{
Thread.Sleep(500);
//do something
});
然后下一个逻辑扩展是将参数传递给您的匿名函数。您可以使用范围执行此操作:
var x=1;
Task.Run(()=>{
x++;
});
然后你基本上可以把 C# 的其余部分扔出窗外。如果你喜欢这种函数式风格,我建议使用 JS 或 C。