"C#的隐藏特性?" [已关闭]
lambda表达式和类型推断被低估了。 Lambda可以包含多个语句,并且它们自动兼容委托对象(只需确保签名匹配),就像这样:
Console.CancelKeyPress += (sender, e) => { Console.WriteLine("CTRL+C detected!\n"); e.Cancel = true; };
请注意,我没有new CancellationEventHandler
,也没有必要指定sender
和e
的类型,它们可以从事件中推断出来。这就是为什么这种方式比编写整个delegate (blah blah)
少费劲,而后者还需要您指定参数的类型。
Lambda不需要返回任何内容,而类型推断在这种情况下非常强大。
顺便说一下,您始终可以返回函数式编程意义上创建Lambda的Lambda。例如,这里是一个创建处理Button.Click事件的Lambda的Lambda的Lambda:
FuncmakeHandler = (dx, dy) => (sender, e) => { var btn = (Button) sender; btn.Top += dy; btn.Left += dx; }; btnUp.Click += makeHandler(0, -1); btnDown.Click += makeHandler(0, 1); btnLeft.Click += makeHandler(-1, 0); btnRight.Click += makeHandler(1, 0);
请注意链接方式:(dx, dy) => (sender, e) =>
这就是为什么我很高兴上了函数式编程课程的原因:-)
除了在C中使用指针之外,我认为这是您应该学习的另一个基本要素:-)