C#之Iambda表达式和事件

Iambda表达式

通过lambda表达式可以访问lambda表达式块外部的变量,这称为闭包。

闭包(closure):Iambda表达式中引用了外部变量的内部函数。

如果给多个线程使用闭包,就可能遇到并发冲突。最好仅给闭包使用不变的类型。这样可以确保不改变值,也不需要同步。

lambda表达式可以用于类型为委托的任意地方。

事件

事件基于委托,为委托提供了一种发布/订阅机制。

通过“+=”创建一个订阅,通过“-=”取消订阅

【通过事件,可直接连接发布程序和侦听器。但是,垃圾回收方面存在问题。例如,如果不再直接引用侦听器,发布程序就仍有一个引用。垃圾回收器不能清空侦听器占用的内存,因为发布程序仍保有一个引用,会针对侦听器触发事件。 这种强连接可以通过弱事件模式来解决,即使用WeakEventManager作为发布程序和侦听器之间的中介。】

绑定委托的简单事件示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace demo28
{
    public delegate void EventHandler(object sender, EventArgs e);
    public class MyEventClass
    {
        public event EventHandler MyEvent;
        public void ChuFa()
        {
            MyEvent(this, EventArgs.Empty);
        }
    }
    public class MyClass : IDisposable
    {
        private bool _disposed=false;
        private MyEventClass _event=new MyEventClass();
        public void Subcribe()
        {
            _event.MyEvent += this.HandleEvent1;
            _event.MyEvent += this.HandleEvent2;
        }
        public void Doing()
        {
            _event.ChuFa();
        }
        private void HandleEvent1(object sender, EventArgs e)
        {
            Console.WriteLine("事件1加载成功!");
        }
        private void HandleEvent2(object sender, EventArgs e)
        {
            Console.WriteLine("事件2加载成功!");
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        private void Dispose(bool disposing)
        {
            if(_disposed) return;
            if(disposing)
            {
                _event = null;
            }
            _disposed = true;
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {
                MyClass myClass = new MyClass();
                myClass.Subcribe();
                myClass.Doing();
                Console.ReadLine();
                Thread.Sleep(1000);
                myClass.Dispose();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a_dafei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值