分类目录

链接

2011 年 12 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
借助委托实现方法嵌套
.NET 暂无评论 阅读(1,932)

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 就类似一个嵌套方法,可以在方法内部多个地方 "重用"。当然,最终编译器会将其编译成一个 "类" 方法,但那已经超出我们要讨论的范围。

原文地址: http://www.rainsts.net/feed.asp?q=comment&id=684

============ 欢迎各位老板打赏~ ===========

【上篇】
【下篇】

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:借助委托实现方法嵌套 | Bruce's Blog

发表评论

留言无头像?