在C#中将变量赋值为动态函数调用的结果

5
在JavaScript中,我可以通过动态创建函数来将值赋给变量。例如:
var name = (function () { name="bob"; return name; }());

我相信在C# 4.0中也可以做到同样的事情。有人能展示一下如何用C#编写上述代码吗?
另外,如果你能提醒我创建这种动态函数的正确术语,我会非常感激!
谢谢您的帮助!
PS:这个问题可能已经被问过了,但由于我对术语不清楚,可能错过了。如果是这样,请原谅!

1
在你的例子中,你正在分配函数本身。而不是函数返回的值。 - Ken Browning
抱歉!如果我将其更改为 function() { name="bob"; return name; }();,它会按预期工作吗? - evan
2个回答

6

您可以使用匿名方法:

Func<string> anonymousFunction = () => { string name = "bob"; return name; };
string myName = anonymousFunction();

第一行的语法是lambda,它是C#3.0及以上版本声明匿名方法的方式。上述函数不接受参数,但您也可以包含它们:

Func<string, string> makeUppercase = x => x.ToUpper();
string upperCase = makeUppercase("lowercase");

请注意,由于只有一个参数,您可以省略其周围的括号。同样,由于整个方法都是一个返回语句,您可以省略大括号以及return语句本身。
当使用LINQ扩展方法时,这种类型的lambda非常常见,因为其中许多方法要求返回值的单参数方法:
var numbers = new List<int>() { 1, 2, 3, 4 };
var divisibleByTwo = numbers.Where(num => num % 2 == 0);

回答你的实际问题,这种语法在C#中是无效的。如果你尝试这样写:

string output = (x => x.ToUpper())("lowercase");

您将收到一个错误消息,提示“需要方法名”。您必须先将匿名方法分配给委托。

非常好,非常感谢!出于好奇,是否有一种方法可以在赋值中声明匿名函数,而不是在上面的行中声明。我问这个问题的原因是我想能够使用这个概念在赋值期间为类的默认属性分配一个值(类似于stu = new student() { name = ()=>(string name = "bob"; return name; })。 - evan
哦,不用理会我上一个评论了,我在打字的时候你已经更新了答案 :)。谢谢! - evan


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接