来自MSDN的Lambda表达式的示例
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
是否可以在不声明代理的情况下执行相同操作?
好吧,因为我认为声明不是正确的词,我会按照我想要的方式编写代码
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
}
为什么我要这样做?
我希望将条件复杂化为单个表达式。但我不想膨胀我的类或添加某种辅助类/什么,因为它不会在另一个范围内使用。
答案 0 :(得分:6)
是否可以在不声明代理的情况下执行相同操作?
不,在没有首先声明类型的情况下,无法创建lambda表达式。委托就像C#中的任何其他对象一样:它必须具有明确定义的类型才能为其赋值。
但是,你可能不需要自己声明类型,因为Microsoft已经为您宣布了大量的类型。如果其中一个预定义的委托类型适合您,请随意使用它们。
例如,如果您的委托占用0到16个参数,则可以使用Action
委托类型之一:
Action x = () => DoStuff();
Action<int> x = i => DoStuff(i);
Action<string, string, string> = (a,b,c) => DoStuff(a,b,c);
如果您需要返回一个值,可以使用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);
等。
其中有更多:Windows窗体或WPF中的每个控件事件都使用预定义的委托类型,通常为EventHandler
或RoutedEventHandler
或某些派生。有Func
的专用版本,例如Predicate
(尽管这些版本大部分都是LINQ之前的版本,并且大部分已过时)。
但是,如果由于某些奇怪的原因,没有任何内置委托类型适合您,那么是的,您需要先定义自己的代理类型才能使用它。
答案 1 :(得分:-1)
您正在寻找Func<*>
代表:
Func<int, int> myDelegate = ...;