C#:委托
Delegate使用三步骤:
1. 声明:
public delegate void ShowDelegate1(); //无参无返回值 public delegate int ShowDelegate2(int a, int b); //有参有返回值 public delegate T ShowDelegate<T>(T t); //泛型
2. 赋值:
ShowDelegate1 myDelegate1 = Fun1; //可以重新赋值,但必须是匹配的类型 myDelegate1 = Test; //对于有参的情况,注意赋值只赋函数名,调用时才传参 ShowDelegate2 myDelegate2 = Fun2; ShowDelegate<string> myDelegate3 = Fun3; ShowDelegate<float> myDelegate4 = Fun4;
3. 调用:
myDelegate1(); int sum = myDelegate2(1,2); myDelegate3("HelloWorld!"); myDelegate4(1.5f);
1 private void Fun1() 2 { 3 Debug.Log("Fun()"); 4 } 5 6 void Test() 7 { 8 Debug.Log("Test"); 9 } 10 11 private int Fun2(int a,int b) 12 { 13 Debug.Log("int Fun2(int a,int b)"); 14 return a + b; 15 } 16 17 private string Fun3(string s) 18 { 19 Debug.Log(s); 20 return s; 21 } 22 23 private float Fun4(float f) 24 { 25 Debug.Log(f); 26 return f; 27 }
- 委托是引用类型,调用之前要赋值,否则为NULL。
.Net内置委托:特点:不用显示的声明,可以直接赋值 (因为在System里已经声明过了)
1. Action:
使用范围:0-16个参数,无返回值的委托。
2. Func:
使用范围:0-16个参数,必须有返回值的委托。
1 //注意最后一个参数代表返回值类型,如果只有一个参数表示无参有1个该类返回值。 2 Func<int,int,bool> f1 = Fun5; 3 private bool Fun5(int a,int b) 4 { 5 if (a > b) 6 return true; 7 else 8 return false; 9 }
匿名方法:
定义:没有名字的方法。
使用范围:函数回调、和委托结合。
1 Action ac1 = delegate () 2 { 3 Debug.Log("匿名方法"); 4 }; //注意匿名方法后有分号 5 ac1();
Event事件:
使用范围:只能用+=、-=添加和撤销事件,且只能在声明自己的类里赋值和调用。
1 public class MyClass 2 { 3 public event Action action; 4 public void Function() 5 { 6 action += delegate () 7 { 8 Debug.Log("event"); 9 }; 10 action(); 11 } 12 }
多播委托:
定义:一个委托中注册多个方法,可以用+、-运算符添加或撤销方法。
1 Action ac1 = delegate () 2 { 3 Debug.Log("匿名方法"); 4 }; //注意匿名方法后有分号 5 ac1 += delegate () 6 { 7 Debug.Log("多播委托"); 8 }; 9 ac1 += Fun1; 10 ac1 -= Fun1; 11 if (ac1 != null) //多播委托可能会撤销到一个方法也没有了,注意判空 12 ac1();
推荐这些文章:
class Program
{
#region 委托作用 解耦,减少重复代码、异步多线程
#endregion
#region Delegate委托 有返回值,无返回值都行 ,有参数无参数都行
//public delegate void myDelegate();
//static void Main(string[] args)
//{
// myDelegate d = new myDelegate(method1);
// ...
问题
delegate int Add(); class Program { static void Main(string[] args) { MyClass myclass=new MyClass (); Add add = myclass.add1; int result1 = add();//此处添加用以个result1来接收调用委托的返回值 add += myclass.add2; add += myclass.add1; Console.WriteLine("最后value的值:{0}", myclass.value);//为什么加了result1后valu...
不带返回值的委托
public delegate void DelegateDemo(String s1, String s2);
public static event DelegateDemo ddo;
public class Test1
{
public void Look1(String s1, String s2)
{
Console.WriteLine("Look1 " + s1 + " -1- " + s2);
...
Type类型
Type. IsAssignableFrom 方法:确定指定类型的实例是否能分配给当前类型实例。
Console.WriteLine(typeof(Person).IsAssignableFrom(typeof(Student)));//True
Console.WriteLine(typeof(Student).IsAssignableFrom(typeof(Person)));//False
Type. IsSubclassOf 方法:确定当前 Type 是否派生自指定的 Type。
...
替 Action/Func Parameter 设置名字 public static void MatchBracket(string value, string bracket, Action<int, int, string> action) { } Action/Func 的 parameter 是不可以设置名字的, 只能声明类型, 对调用的人不友好. Can you name the parameters in a Func<T> type? 有 2 个方法可以让它好一些. 1. 用 delegate 声明 public delegate v...
C# 委托 Delegate
Delegate 类表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
委托的声明、实例化和调用
声明
以下实例声明为Del的委托,该委托采用字符串作为参数,并返回void的方法:
public delegate void Del(string message);
实例化
Delegate的实例化和Class的实例化基本类似。
以下实例是,创建一个Del委托的实例。因为该委托声明是:采用字符串作为参数,并返回void的方法,所以实例化该委托时需要传递一个符号条件的方法作为参数:
Del handler = new Del(Dele...
引言
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
将方法作为方法的参数
我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候...
1、定义
System.Timers.Timer ChangeUI_Timer = new System.Timers.Timer(); private delegate void myDelegate();//添加一个委托代理 int TimerLoad = 0;
2、Load部分
private void Form1_Load(object sender, EventArgs e) { ChangeUI_Timer.Interval = 100; ChangeUI_Timer.Elap...
特点:又叫发布者/订阅者模式,定义了一种一对多的关系,当被监听对象发生变化时,会通知所有观察者对象。
思考:委托里学过的多播委托,一个委托可以注册多个方法,当这个委托执行时,所有的方法都会被调用。
案例:猫追老鼠经典案例。一只猫来了之后,所有的老鼠都跑了。
1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4 using System;
5
6 public class Visit : MonoBehaviour {
7 p...
应用场景:自定义控件注册委托和事件,传入参数,由使用自定义控件的表单实现事件逻辑处理
1、BCtrl 自定义控件定义委托和事件,将参数传给事件UpdateAfterRefreshed
public partial class BCtrl: UserControl{ public delegate void Refresh(string str); public event Refresh UpdateAfterRefreshed;
...
private void Test(string str){
...
if (UpdateAfterRefres...
文章链接:https://www.dianjilingqu.com/4775.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。