c# 委托

关于委托

1.什么是委托

委托就是将一个方法作为一个参数进行传递,从而可以在另一个方法中进行使用。

2.为什么要使用委托

首先,在c#委托是一个引用类型的存在,这就意味着你在使用委托之前就必须去实例化它
下面这段话是在其他文章中看到的,引用一下
“没有委托 就没有安全指针用
没有委托 就没有事件用
没有委托 就没有回调用
没有委托 也没有异步调用
没有委托 就没有多个进程
没有委托 就没有windows form
没有委托 那么你也不用学习.net 了
那么你说委托 有什么用?”

在使用委托时首先要 定义——>声明——>实例化——>作为参数传递给方法——>使用委托。下面就具体看下如何使用委托的:
定义委托 :

这是一个具有bool类型返回值而且带有泛型参数的一个委托;

 public delegate bool MyFindDelegate<T>(T t);

下面这个方法中声明了对该委托进行了声明

public static void MyFind<T>(List<T> list, MyFindDelegate<T> myFindDelegate)
        {

            foreach (var item in list)
            {
                if (myFindDelegate(item))
                {
                    Console.WriteLine("Result is :" + item);
                    break;
                }            
            }
        }

最后是调用该委托并执行

        static void Main(string[] args)
        {           
            //MyFind(list, toDo);
            MyFind(list, delegate (int i)
            {
                return i == 4;
            });
            MyFind(list,m=>m==2);
        }

3.关于action<> 以及Func<>

区别:当我们的方法无返回值的时候使用action<>,有返回值的时候使用Func<>
action<> 为了大家更加方便的使用委托,不用每次使用前都去定义一个delegate,于是微软就定义了action,其实就是对delegate的一个封装,
Func<string ,int,string> 该委托中最多可以添加16个参数,其中默认最后一个为返回值类型,如果只有一个参数,则第一个参数就是返回值

4.多播委托及事件event

多播委托:

1可以使用+=、 -=将方法赋值给委托类型

2.可以通过delegateName()直接触发
以下代码为多波委托的简单使用,可直接在应用台控制程序中执行

        public delegate void MutilDelegate();
        static void Main(string[] args)
        {
            Presson presson = new Presson();
            presson.DelMutil += Test1;
            presson.DelMutil += Test2;
            presson.DelMutil += Test3;
            presson.PressonRun();


            //MutilDelegate aa = null;

            //aa += Test1;
            //aa += Test2;
            //aa += Test3;
            //aa();
        }



      public static void Test1()
        {
            Console.WriteLine("This is Test1");
        }
        public static void Test2()
        {
            Console.WriteLine("This is Test2");
        }
        public static void Test3()
        {
            Console.WriteLine("This is Test3");
        }

        public class Presson
        {
            public MutilDelegate DelMutil { get; set; }


            public void PressonRun()
            {
                DelMutil();
            }

        }

事件:

1.类似多播委托,本质更像是委托的一个实例,但是具有封装性。

2.不像委托一样可以直接赋值,但是可以通过+= 和 -=增加和移除函数。

3.不能像delegate一样在类的外部直接定义使用

事件的使用与多波委托的使用基本类似,唯一的区别在于多波委托可以直接进行方法的赋值,而事件不行,事件必须通过+=、-=的操作进行赋值,这也提高了事件使用的安全性,确保了事件不被随意的调用

  public delegate void EventDel(string aa);
        static void Main(string[] args)
        {
            Presson presson = new Presson("张三", "3");

            presson.eventDel += EventHandel;
            presson.PressonRun();
        }

        private static void EventHandel(string msg)
        {
            Console.WriteLine(msg);
        }

        public class Presson
        {
            public Presson(string UserName, string Times)
            {
                this._UserName = UserName;
                this._Times = Times;
            }
            public string _UserName { get; set; }
            public string _Times { get; set; }
            public event EventDel eventDel;

            public void PressonRun()
            {
                eventDel("这是" + this._UserName + "的第" + this._Times + "次失败");
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 委托(Delegate)是一种类型,它可以用于封装一个或多个方法,使其可以像其他对象一样传递、存储和调用。委托在事件处理、多线程等方面有着广泛的应用。 C# 委托的声明方式与方法类似,可以带有参数和返回值类型,例如: ```csharp public delegate int Calculate(int a, int b); ``` 上面的代码声明了一个名为 `Calculate` 的委托类型,它包含两个 `int` 类型的参数并返回一个 `int` 类型的值。接下来可以使用这个委托类型来封装一个或多个方法。 委托的使用步骤如下: 1. 声明委托类型 ```csharp public delegate void MyDelegate(string message); ``` 2. 定义委托变量 ```csharp MyDelegate myDelegate; ``` 3. 实例化委托变量 ```csharp myDelegate = new MyDelegate(MethodA); ``` 4. 调用委托 ```csharp myDelegate("Hello"); ``` 完整的示例代码如下: ```csharp using System; namespace DelegateDemo { public delegate void MyDelegate(string message); class Program { static void Main(string[] args) { MyDelegate myDelegate; myDelegate = new MyDelegate(MethodA); myDelegate += new MyDelegate(MethodB); myDelegate("Hello"); } static void MethodA(string message) { Console.WriteLine("MethodA: " + message); } static void MethodB(string message) { Console.WriteLine("MethodB: " + message); } } } ``` 上面的代码定义了一个名为 `MyDelegate` 的委托类型,包含一个 `string` 类型的参数并返回一个 `void` 类型的值。在 `Main` 方法中,首先将 `myDelegate` 委托变量实例化为 `MethodA` 方法,然后再将其实例化为 `MethodB` 方法。最终调用 `myDelegate` 委托变量时,将会依次调用 `MethodA` 和 `MethodB` 方法。 除了以上示例中的简单委托,还有多播委托、泛型委托、匿名委托等更加高级的委托用法,可以根据具体需求选择使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值