C# lambda表达式参数的不利行使姿势

C#的lambda表达式的好用就无多说了,中午用餐的时光猛然想到一个以前(有年头了,难道屌丝上夏数了便回忆这啊。。。)和同事争执之坑。。

列个demo吧。。

率先一个近乎,这个仿佛的靶子就是是为吃堆内存用的,,

    public class MemoryModel
    {
        public MemoryModel(int id)
        {
            Data = new byte[1024 * 1024];
            Id = id;
        } 
        public byte[] Data { set; get; }
        public int Id { set; get; }
    }

接下来再次来只近乎存放个事件

    public class EventClass
    {
        public void Show(int m)
        {
            if (ShowMe != null)
                ShowMe(m);
        }
        public event Action<int> ShowMe;
    }

测试代码如下;

        EventClass e = new EventClass();
            int i = 0;
            while (true)
            {
                List<MemoryModel> list = new List<MemoryModel>();
                i++;
                for (int j = 0; j < 100; j++)
                {
                    var mod = new MemoryModel(i);
                    e.ShowMe += c =>
                    {
                        string s = mod.Id + "----" + mod.Data.Length;
                        Console.Write(c);
                    };
                    list.Add(mod);
                }
                Thread.Sleep(50);
                list.Clear(); 
            }

估价乍一禁闭,不知所云。。不明所以。其实重要想说的凡事件注册之之lambda表达式,这块存在于充分的题材,很多人数以有利于会以lambda表达式内一直下作用域范围外的靶子,比如说这个mod对象,委托为尽管是艺术的援,也可说凡是方式的指针,运行时在实行方时会见打开栈帧,并将艺术以到的参数或参数的援存储到该栈帧的有些变量区中,此处我定义之风波目测只发生一个int类型的参数,但由这种自由的编码就造成了自附加了简单单参数,也就算是mod对象。也就是说这个mod对象见面让有变量区持续引用也尽管时有发生了废品回收器无法对该对象开展回收了,直到EventClass对象释放了(当然是道外是免会见之。。)。结果吗就算内存泄漏了。。

当场景不单独是以斯while场景下,委托内以作用域范围外之对象都见面加那个目标的生命周期。。

对此这种景象时有发生的场景。。还是产生部分的。。。

 

 

相关文章