模拟方法嵌套

添加人:wuzheworld一级(223分)   添加时间:2008-06-18    阅读次数:285  收藏此教程
C# 并不支持方法嵌套,也就是说我们不能写出下面这样的代码。
void Test()
{
  void Inner(int x)
  {
  }

  Inner(123);
}

但某些时候,方法嵌套却非常有用,比如说方法内的某些局部代码会被多个 "不连续" 区域调用。当然,我们可以将这些 "公用代码" 提取为类私有方法成员。但这么做有些 "别扭",或者说是 "不好看"。毕竟这些代码的使用者只有当前这个方法,将其作用域提升,有 "污染" 的嫌疑。借助于委托,我们很容易 "模拟" 出方法嵌套。

试验原型
static void Test()
{
  var a = new[] { 1, 3, 5 };
  var b = new[] { 2, 4, 6 };

  var listA = new List<int>();
  foreach (var item in a)
  {
    listA.Add(item % 2);
  }

  var listB = new List<int>();
  foreach (var item in b)
  {
    listB.Add(item % 2);
  }
}

虽然这个演示方法很简单,但我们依然可以将其修改得更漂亮点。
static void Test()
{
  var a = new[] { 1, 3, 5 };
  var b = new[] { 2, 4, 6 };

  Func<int[], List<int>> mod = array =>
    {
      var list = new List<int>();
      foreach (var item in array)
      {
        list.Add(item % 2);
      }

      return list;
    };

  var listA = mod(a);
  var listB = mod(b);
}
static void Test()
{
  var a = new[] { 1, 3, 5 };
  var b = new[] { 2, 4, 6 };

  var mod = new Func<int[], List<int>>(array =>
    {
      var list = new List<int>();
      foreach (var item in array)
      {
        list.Add(item % 2);
      }

      return list;
    });

  var listA = mod(a);
  var listB = mod(b);
}

改写后的 mod 就类似一个嵌套方法,可以在方法内部多个地方 "重用"。当然,最终编译器会将其编译成一个 "类" 方法,但那已经超出我们要讨论的范围。
1页 第1上一页1下一页
相关的教程: C#
收藏此教程

当前平均分: 0.0(0 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: