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

 

 

推荐这些文章:

C#委托

class Program
{
#region 委托作用 解耦,减少重复代码、异步多线程

#endregion

#region Delegate委托 有返回值,无返回值都行 ,有参数无参数都行
//public delegate void myDelegate();
//static void Main(string[] args)
//{
// myDelegate d = new myDelegate(method1);
// ...

关于C#委托的一个问题

问题
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...

C# 委托三种使用

不带返回值的委托
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);
...

C#反射和特性的使用方法

Type类型
Type. IsAssignableFrom 方法:确定指定类型的实例是否能分配给当前类型实例。

Console.WriteLine(typeof(Person).IsAssignableFrom(typeof(Student)));//True
Console.WriteLine(typeof(Student).IsAssignableFrom(typeof(Person)));//False

Type. IsSubclassOf 方法:确定当前 Type 是否派生自指定的 Type。

...

C# – 冷知识 (新手)

替 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

C# 委托 Delegate

Delegate 类表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。

委托的声明、实例化和调用
声明
以下实例声明为Del的委托,该委托采用字符串作为参数,并返回void的方法:
public delegate void Del(string message);

实例化
Delegate的实例化和Class的实例化基本类似。
以下实例是,创建一个Del委托的实例。因为该委托声明是:采用字符串作为参数,并返回void的方法,所以实例化该委托时需要传递一个符号条件的方法作为参数:
Del handler = new Del(Dele...

通俗理解C#委托和事件

引言
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
将方法作为方法的参数
我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候...

C# winform 计时

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...

C#之设计模式:观察者模式

特点:又叫发布者/订阅者模式,定义了一种一对多的关系,当被监听对象发生变化时,会通知所有观察者对象。

思考:委托里学过的多播委托,一个委托可以注册多个方法,当这个委托执行时,所有的方法都会被调用。

案例:猫追老鼠经典案例。一只猫来了之后,所有的老鼠都跑了。

 

1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4 using System;
5
6 public class Visit : MonoBehaviour {
7 p...

C# 自定义委托与事件应用

应用场景:自定义控件注册委托和事件,传入参数,由使用自定义控件的表单实现事件逻辑处理
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...

文章标题:C#:委托
文章链接:https://www.dianjilingqu.com/4775.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>