boo*_*oop 3 c# lambda expression
来自MSDN的Lambda表达式的示例
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
Run Code Online (Sandbox Code Playgroud)
是否可以在不声明代表的情况下执行相同的操作?
好吧,因为我认为声明不是正确的词,我会编写代码,因为我想这样做
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
Run Code Online (Sandbox Code Playgroud)
我为什么要那样做?
我希望将条件复杂化为单个表达式.但我不想膨胀我的类或添加某种辅助类/什么,因为它不会在另一个范围内使用.
是否可以在不声明代表的情况下执行相同的操作?
不,如果没有首先声明一个类型,就不可能创建一个lambda表达式.委托就像C#中的任何其他对象一样:它必须具有明确定义的类型才能为其赋值.
但是,您可能不需要申报类型自己,因为微软已宣布一吨他们给你的.如果其中一个预定义的委托类型适合您,请随意使用它们.
例如,如果您的委托占用0到16个参数,则可以使用其中一种Action委托类型:
Action x = () => DoStuff();
Action<int> x = i => DoStuff(i);
Action<string, string, string> = (a,b,c) => DoStuff(a,b,c);
Run Code Online (Sandbox Code Playgroud)
如果需要返回值,可以使用其中一种Func委托类型:
Func<int> x = () => 6;
Func<int, int> x = i => i * i;
Func<string, string, string, string> x = (a,b,c) => a.Replace(b, c);
Run Code Online (Sandbox Code Playgroud)
等等
有吨更多的人:在Windows窗体或WPF每个控件事件使用预定义的委托类型,通常是EventHandler或RoutedEventHandler或某些衍生物.有专门的版本Func,例如Predicate(虽然这在很大程度上日期前的LINQ和大多是过时的).
但是,如果由于某些奇怪的原因,没有任何内置委托类型适合您,那么是的,您需要在使用之前定义自己的代理类型.