我最近来了一个静态方法,声明为:
public class Foo { public static Func<HtmlHelper,Propertyviewmodel,string> Render = (a,b) => { a.RenderPartial(b); return ""; }; }
Intellisense建议使用(例如):
string s = Foo.Render(htmlHelper,propertyviewmodel);
以下是等同的:
public static string Render(HtmlHelper a,Propertyviewmodel b) { a.RenderPartial(b); return ""; }
A)第一种风格的名称是什么?我意识到它正在使用lambdas;这是绊倒我的标志.我不能标记它)
B)如果两个代码块是等效的,那么后者使用前者的好处是什么?
解决方法
在大多数情况下,它们似乎在功能上相当.实际上你可以通过一个普通的方法作为一个变量.
但是有一些微妙的差异,如能够将功能重新定义为别的东西.如果您使用反射,也可能会有所不同.它可能不会在类的方法列表中返回. (不是100%肯定在反射部分)
以下显示了将方法作为变量传递,以及第二种方式如何允许重新定义Func,如果它是一种常规方法将是不可能的.
class Program { static void Main(string[] args) { Console.WriteLine(GetFunc()); //Prints the ToString of a Func<int,string> Console.WriteLine(Test(5)); //Prints "test" Console.WriteLine(Test2(5)); //Prints "test" Test2 = i => "something " + i; Console.WriteLine(Test2(5)); //Prints "something 5" //Test = i => "something " + i; //Would cause a compile error } public static string Test(int a) { return "test"; } public static Func<int,string> Test2 = i => { return "test"; }; public static Func<int,string> GetFunc() { return Test; } }
这只是让我想到…如果所有的方法都是这样宣称的,你可以在C#中有真正的first class functions …有趣….