保证每个本地函数只有一个闭包对象吗?

时间:2018-04-19 09:44:36

标签: c# closures language-lawyer

我想知道我是否可以从一个本地函数中创建多个委托并依赖它们完全相同?

换句话说,如果我让多个委托引用相同的本地函数,它们是否都是等价的?或者,如果我需要它们,我应该确保只创建一个吗?

当然,假设它们都是在单个方法调用期间创建的。否则,必须创建多个闭包对象。

例如,此代码是否始终只打印一行?

class EventSource
{
    public event EventHandler Event;

    public void Raise() => Event?.Invoke(this, EventArgs.Empty);
}

static class Program
{
    static void Main()
    {
        var source = new EventSource();
        var root = Math.Sqrt(2).ToString();
        void PrintThenUnsubscribe(object sender, EventArgs e)
        {
            Console.WriteLine("Square root of 2: " + root);
            source.Event -= PrintThenUnsubscribe;
        }

        source.Event += PrintThenUnsubscribe;
        source.Raise();
        source.Raise(); // Doesn't print the second time.
    }
}

编辑:

这是一个更简单的例子:

using System;
using System.Diagnostics;

static class Program
{
    static void Main()
    {
        var root = Math.Sqrt(2);
        void print() => Console.WriteLine(root);

        Action a1 = print;
        Action a2 = print;
        Debug.Assert(a1 == a2);
    }
}

0 个答案:

没有答案