C# 2.0 中的三个匿名函数特性
2012年11月20日
C# 2.0的特性中,有三个非常好用的特性。一是delegate关键字可以用来写匿名函数。二是有Func和Action这两个类库中的泛型委托能用来匹配函数的类型。三是captured variable,也就是匿名函数中能捕获当前运行环境中的变量,比如函数的局部变量。以下代码演示了这三个特性的使用:
protected void VerifyDeletedNodes(){ List<IBTreeNode<T>> all_nodes = new List<IBTreeNode<T>>(); int idx; int matchcnt = 0; int num_leaf; int num_nleaf; GetAllNodes_rec(all_nodes, m_root); if (Utility.TraceFlag) { Console.WriteLine("Verify: all {0} nodes retrieved", all_nodes.Count); } all_nodes.Sort(new HashCodeComparer<IBTreeNode<T>>()); foreach (IBTreeNode<T> deldnode in m_deleted_nodes) { idx = all_nodes.BinarySearch(deldnode, new HashCodeComparer<IBTreeNode<T>>()); if (idx >= 0) { if (Utility.TraceFlag) { Console.WriteLine("Verify: hash code coincidence"); } idx = ArrayUtil.BackToFirst(all_nodes, deldnode, idx, new HashCodeComparer<IBTreeNode<T>>()); ArrayUtil.WhileEqual(all_nodes, idx, new HashCodeComparer<IBTreeNode<T>>(), delegate(IBTreeNode<T> x) { if (Object.ReferenceEquals(x, deldnode)) { matchcnt++; } }); } /* deleted nodes do not appear in the tree */ Trace.Assert(matchcnt == 0); /* also account them now (didn't do it on deletion) */ if (deldnode is BTreeNonLeafNode<T>) { m_commondata.m_num_nleaf--; } else { Trace.Assert(deldnode is BTreeLeafNode<T>); m_commondata.m_num_leaf--; } } m_deleted_nodes.Clear(); /* BTW, we also account the number of leaf and non-leaf nodes { */ num_leaf = 0; num_nleaf = 0; foreach (IBTreeNode<T> noderef in all_nodes) { if (noderef is BTreeNonLeafNode<T>) { num_nleaf++; } else { Trace.Assert(noderef is BTreeLeafNode<T>); num_leaf++; } } Trace.Assert(m_commondata.m_num_nleaf == num_nleaf); Trace.Assert(m_commondata.m_num_leaf == num_leaf); /* } */}上述代码是我的BTreeDemo4.cs中的一段验证代码,其中ArrayUtil.WhileEqual