我刚刚阅读了Microsoft Surface Tutorial.有以下C#示例:
private void OnCenterItems(object sender, RoutedEventArgs e)
{
var x = this.Photos.ActualWidth / 2;
var y = this.Photos.ActualHeight / 2;
FindChildren(this.Photos, d => d.GetType() == typeof(ScatterViewItem),
d => ((ScatterViewItem)d).Center = new Point(x,y));
}
private void FindChildren(DependencyObject source,
Predicate<DependencyObject> predicate,
Action<DependencyObject> itemFoundCallback)
{
int childCount = VisualTreeHelper.GetChildrenCount(source);
for (int i = 0; i < childCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(source, i);
if (predicate(child))
{
itemFoundCallback(child);
}
FindChildren(child, predicate, itemFoundCallback);
}
}
Run Code Online (Sandbox Code Playgroud)
我想我或多或少地了解这两种方法正在做什么,但我从未见过像这样的方法调用:
FindChildren(this.Photos, d => d.GetType() == typeof(ScatterViewItem),
d => ((ScatterViewItem)d).Center = new Point(x,y));
Run Code Online (Sandbox Code Playgroud)
这可能是因为我是一名Java程序员.那么有人可以解释这种语法在做什么吗?
您对以下内容的看法是C#lambda表达式
d => d.GetType() == typeof(ScatterViewItem)
Run Code Online (Sandbox Code Playgroud)
它本质上是一个产生委托的表达式.有些人喜欢将它们视为内联函数.
这里有一些阅读参考
这些是lambda表达式,生成匿名方法.
d => d.GetType() == typeof(ScatterViewItem)
Run Code Online (Sandbox Code Playgroud)
这可以写成
(object d) => { return (d.GetType() == typeof(ScatterViewItem)); }
Run Code Online (Sandbox Code Playgroud)
如果写出来,这个调用将代表这个方法:
public bool CheckObjecteEqualsScatterViewItemType (object d)
{
return d.GetType() == typeof(ScatterViewItem);
}
Run Code Online (Sandbox Code Playgroud)
该方法FindChildren需要一个泛型委托(比较C中的函数指针,但是强类型)Func<object, bool>(即任何获取对象并返回bool的方法)作为参数给出,lambda表达式动态生成此方法.(这是由编译器完成的,因此这不是在运行时完成的,并且是完全类型检查的,并且不会损失性能).