代码之家  ›  专栏  ›  技术社区  ›  anon

这是什么奇怪的方法调用?

  •  4
  • anon  · 技术社区  · 14 年前

    我刚刚读了微软表面教程。有以下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);
        }
    }
    

    我想我或多或少理解这两个方法在做什么,但我从未见过这样的方法调用:

     FindChildren(this.Photos, d => d.GetType() == typeof(ScatterViewItem), 
                               d => ((ScatterViewItem)d).Center = new Point(x,y));
    

    这可能是因为我是一个Java程序员。那么有人能解释一下这个语法在做什么吗?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Femaref    14 年前

    这些是lambda表达式,生成匿名方法。

    d => d.GetType() == typeof(ScatterViewItem)
    

    这可以写为

    (object d) => { return (d.GetType() == typeof(ScatterViewItem)); }
    

    此调用将表示此方法,如果写出:

    public bool CheckObjecteEqualsScatterViewItemType (object d)
    {
      return d.GetType() == typeof(ScatterViewItem);
    }
    

    方法 FindChildren 需要一个泛型委托(可与C中的函数指针比较,但强类型) Func<object, bool> (即,任何获取对象并返回bool的方法)将作为参数给定,lambda表达式将立即生成此方法。(这是由编译器完成的,因此 在运行时完成,并进行完全类型检查,不会导致性能损失)。

        2
  •  5
  •   JaredPar    14 年前

    您在下面看到的是一个C lambda表达式

    d => d.GetType() == typeof(ScatterViewItem)
    

    它本质上是一个产生委托的表达式。有些人喜欢把它们看作内联函数。

    这是一些参考资料

        3
  •  2
  •   Jason Kleban    14 年前

    d => d.GetType() == typeof(ScatterViewItem) 被称为lambda表达式。它表示“对于任何DependencyObject,d,return(d.getType()==typeof(scatterViewItem))”。它是一个没有名字的方法,一个匿名方法。

    长手牌是:

    static bool myPredicate(DependencyObject d)
    {
      return d.GetType() == typeof(ScatterViewItem);
    }
    

    打电话:

    FindChildren(this.Photos, myPredicate, [...] )
    

    Predicate<DependencyObject> 是委托类型或“签名形状”。它可以保存对任何获取DependencyObject并返回bool的方法的引用。

    findchildren知道使用提供的谓词来评估它应该做什么。因为它需要某些类型的数据并返回某些类型的数据,findchildren不关心操作是如何发生的,它可以调用它并知道它将得到一个有用的答案。

        4
  •  1
  •   David R Tribble    14 年前

    这个 => 是新的“lambda”运算符,用于动态定义函数。

    见: www.switchonthecode.com/tutorials/csharp-tutorial-the-lambda-operator