Lamde表达式
有些迷糊,看例子:
有时遇到这种:Action委托类型中传递匿名方法 obj=>{}的写法
有时遇到这种:Action委托类型中传递匿名方法 obj=>{}的写法
_minCommand.DoExecute = new Action<object>(obj => { (obj as Window).WindowState = WindowState.Minimized;//最小化窗口 });
另一种:Action委托类型中传递匿名方法 ()=>{}的写法
BeginInvoke(new Action(() => { double Max = 0, Min = 0, Mid = 0, AVR = 0, R = 0, S = 0; int RealN = 0; chartHelp.DataAnalysis(Dic01, 300, ref Max, ref Min, ref Mid, ref AVR, ref R, ref S,ref RealN); chartHelp.DrawLine(Chart_FoldLine01, 300, Max, Min, Mid, Dic01); LB_MAX01.Text = Max.ToString("0.00"); LB_MIN01.Text = Min.ToString("0.00"); LB_AVR01.Text = Mid.ToString("0.00"); LB_N01.Text = "300"; LB_RealN01.Text = RealN.ToString(); LB_R01.Text = R.ToString("0.00"); LB_3σ01.Text = S.ToString("0.000"); }));
区别:obj=>其实就是(obj)=>{}的写法,代表汗一个参数的匿名方法,参数为obj
()=>{}的写法是无参数的匿名方法
我们来看另一种:直接是 t=>方法名省略了{}中括号,这是在只有一个方法传进委托时的写法
tokenSourceDraw = new CancellationTokenSource(); ThreadPool.QueueUserWorkItem(t => ThreadDrawLine01(tokenSourceDraw.Token));
等同于
tokenSourceDraw = new CancellationTokenSource(); ThreadPool.QueueUserWorkItem(t => {ThreadDrawLine01(tokenSourceDraw.Token);});
含有多个参数写法:
(x,y)=>{}
总结:
// 无参数的Lambda表达式 Func<int> getZero = () => 0; // 带有单个参数的Lambda表达式 Func<int, bool> isEven = x => x % 2 == 0; // 带有多个参数的Lambda表达式 Func<int, int, int> add = (x, y) => x + y;
Lambda 表达式具有隐式类型,由编译器根据上下文推断。但是,我们也可以使用委托或Func/Action类型来显式指定Lambda表达式的类型。
// 使用Func委托类型 Func<int, int, int> multiply = (x, y) => x * y; // 使用Action委托类型(无返回值) Action<string> displayMessage = message => Console.WriteLine(message);
WPF中开发实例:
public Action<object> DoAction { get; set; }//定义一个Action<object> 委托类型 public Func<object, bool> DoCanExecute { get;set; }//定义有返回值的委托类型Func
使用:
_valueCommand = new CommandBase() { DoAction = new Action<object>(ValueCommandAction), DoCanExecute=new Func<object, bool>(CanExcute) };//实例化同时传递方法给委托DoAction在CommandBase中执行,父类引用指向子类对象