当前位置:  开发笔记 > 编程语言 > 正文

在方法调用之间缓存了哪些(如果有的话)本地定义的委托?

如何解决《在方法调用之间缓存了哪些(如果有的话)本地定义的委托?》经验,为你挑选了2个好方法。

这在我的另一个问题中提到过,我认为将它添加到记录中可能会有用.在下面的程序中,本地定义的委托(如果有的话)在调用Work方法之间缓存,而不是每次都从头开始创建?

namespace Example
{
    class Dummy
    {
        public int age;
    }

    class Program
    {
        private int field = 10;

        static void Main(string[] args)
        {
            var p = new Program();

            while (true)
            {
                p.Work();
            }
        }

        void Work()
        {
            int local = 20;

            Action a1 = () => Console.WriteLine(field);
            Action a2 = () => Console.WriteLine(local);
            Action a3 = () => Console.WriteLine(this.ToString());
            Action a4 = () => Console.WriteLine(default(int));
            Func dummyAgeMatch = (l, r) => l.age == r.age;

            a1.Invoke();
            a2.Invoke();
            a3.Invoke();
            a4.Invoke();
            dummyAgeMatch.Invoke(new Dummy() { age = 1 }, new Dummy(){ age = 2 });
        }
    }
}

Jon Skeet.. 7

根据Reflector显示的内容,最后两个(a4dummyAgeMatch)由MS C#3.0编译器缓存(在我的特定构建中称为"CS $ <> 9_CachedAnonymousMethodDelegate5"和"CS $ <> 9_CachedAnonymousMethodDelegate6"的字段中).

这些可以缓存,而显然其他的依赖于捕获的变量.

我不相信规范要求行为,但Mono编译器的行为方式大致相同(使用不同的变量名称).



1> Jon Skeet..:

根据Reflector显示的内容,最后两个(a4dummyAgeMatch)由MS C#3.0编译器缓存(在我的特定构建中称为"CS $ <> 9_CachedAnonymousMethodDelegate5"和"CS $ <> 9_CachedAnonymousMethodDelegate6"的字段中).

这些可以缓存,而显然其他的依赖于捕获的变量.

我不相信规范要求行为,但Mono编译器的行为方式大致相同(使用不同的变量名称).



2> Marc Gravell..:

好吧,回答具体问题:最后两个是唯一缓存的,因为它们没有捕获任何东西.你可以在反射器中看到这个(但它并不漂亮).当然,您可以调整它们以通过传入args 使它们可重用:

Action a1 = p => Console.WriteLine(p.field);
Action a2 = i => Console.WriteLine(i);
Action a3 = p => Console.WriteLine(p.ToString());
Action a4 = () => Console.WriteLine(default(int));
Func dummyAgeMatch = (l, r) => l.age == r.age;

并传递thisa1/ a3,和locala2.因为他们没有直接捕捉任何事,他们都可以被缓存(CS$<>9__CachedAnonymousMethodDelegate5CS$<>9__CachedAnonymousMethodDelegate9对我来说,至少).当然,他们失去了直接重新分配(先前捕获的)变量的能力,但FP倡导者无论如何都不会喜欢;-p您总是可以将更新后的值作为返回值传递回来,或者声明委托类型有ref参数(我不推荐它).

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有