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());
}
}
}
}