委托
C#中的委托类似于C或C++中函数的指针。委托是存有某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托特别用于实现事件和回调方法。所有委托都派生自System.Delegate类。
委托可以理解为一种数据类型,这种类型赋值需要赋一个与之对应的方法。
委托的声明
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
委托的赋值
有委托是声明决定了可给当前委托赋值的方法类型
static void Method(string s,int a)
{
Console.WriteLine(s+"的年龄是"+a);
}
static void Main(string[] args)
{
MyDelegate my = Method;
my("张三",30);
Console.ReadLine();
}
委托的使用
委托的调用其实就是他所指向的方法的一个调用执行,因此委托的执行也是一对小括号,按照参数填写
实例化委托
一旦声明了委托类型,委托对象必须使用new关键字来创建,且与一个特定的方法有关。当创建委托时,传递到new语句的参数就像方法调用一样书写,但是不带有参数。
static void Main(string[] args)
{
MyDelegate my = new MyDelegate(Method);
MyDelegate my2 = new MyDelegate(Method2);
my("张三",12);
my2("李四", 22);
Console.ReadLine();
}
static void Method(string s,int a)
{
Console.WriteLine(s+"的年龄是"+a);
}
static void Method2(string s, int a)
{
Console.WriteLine(s + "的年龄是" + a);
}
系统委托
Action委托
代表无返回值类型的委托
static void Method1()
{
Console.WriteLine("无返回值无参");
}
static void Main(string[] args)
{
Action a = Method1;
a();
Console.ReadLine();
}
如果说需要指向一个有参数的无返回值方法
static void Method2(string s)
{
Console.WriteLine("它的名字叫"+s);
}
static void Main(string[] args)
{
Action<string> a2 = Method2;
a2("旺财");
Console.ReadLine();
}
使用Action委托,可以指向无返回值的方法,参数情况如果无参则直接使用action,如果有参使用Action泛型,最多容纳16个参数
Func委托
static int Method1()
{
return 100;
}
static void Main(string[] args)
{
Func<int> f = Method1;
Console.WriteLine(f());
Console.ReadLine();
}
Func委托代表具有返回值类型的委托
Func委托泛型中的最后一个参数的类型永远决定着指向的方法的返回值类型
Func委托最多支持16个参数方法
多播委托
委托对象可使用“+”运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。“-”运算符可用于从合并的委托中移除组件委托。
是用委托的这个有用的特点,可以创建一个委托被调用是要调回的方法的调用列表。这被称为委托的多播,也称组播。
static void Method1(int i)
{
Console.WriteLine("数组1"+i);
}
static void Method2(int i)
{
Console.WriteLine("数字2"+i);
}
static void Method3(int i)
{
Console.WriteLine("数字3"+i);
}
static void Main(string[] args)
{
Action<int> a = new Action<int>(Method1);
a += Method2;
a += Method3;
a(4);
Console.ReadLine();
}
事件
事件基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。
通过事件使用委托
事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。
发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。
订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。
事件和委托的区别
1.事件在类外绑定事件只能用“+=”(“-=”解绑),不能使用‘=’绑定;如果在类内部绑定事件可以用‘=’;
2.委托在类内类外都可以用"+="、"-="、"=";
3.事件的调用(执行)只能在类内调用;委托(公有)在类内类外都可以调用;
事件实际上是一个特殊的委托实例,不用事件也没有关系。
class Person
{
public delegate void SetWork();
public event SetWork ShowInfor;
public void Start()
{
ShowInfor();
}
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.ShowInfor += P_ShowInfor;
p.Start();
Console.ReadLine();
}
private static void P_ShowInfor()
{
Console.WriteLine("你好");
}
}