这个奇怪的方法是什么?

4 c# lambda

我刚刚阅读了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程序员.那么有人可以解释这种语法在做什么吗?

Jar*_*Par 5

您对以下内容的看法是C#lambda表达式

d => d.GetType() == typeof(ScatterViewItem)
Run Code Online (Sandbox Code Playgroud)

它本质上是一个产生委托的表达式.有些人喜欢将它们视为内联函数.

这里有一些阅读参考


Fem*_*ref 5

这些是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表达式动态生成此方法.(这是由编译器完成的,因此这不是在运行时完成的,并且是完全类型检查的,并且不会损失性能).