C#四种初始化委托,以及 Action 与委托关系,(夯实基础)

关于委托的声明,实例化,官方有如下几种方式:

new ,简单声明,匿名(){},lambda四种方式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskDemo
{
    class DelegateDemo
    {
        //委托,声明,实例化,以及使用委托
        public delegate void Del(string str);
        public delegate string Del2(string str);
        //第一种方法:非常传统方式,定义一个该委托类型的方法,
        public void Notify(string name) {
            Console.WriteLine(name);
        }
        public void Notify_()
        {
            Console.WriteLine("无参");
        }
        //第一种方法:C# 2.0语法中,new一个实例
        public void TestDemo1()
        {
            Del delinstance =new Del(Notify);
            //Del delinstance2 = Notify_;
        }

        //第二种方法:C# 2.0语法中,简单声明
        public void TestDemo2()
        {
            Del delinstance = Notify;
            //Del delinstance2 = Notify_;
        }
        //第三种方法:C# 2.0语法中,及更高版本中,还有匿名方式
        public void TestDemo3()
        {
            //接受一个类似的委托,匿名方式定义一个委托
            Del delinstance = delegate(string name) {
                Console.WriteLine(name);
            };
            Del2 delinstance2 = delegate (string name) {
                Console.WriteLine(name);
                return "我是匿名方式定义委托!";
            };
            //Del delinstance2 = Notify_;
        }

        //第四种方法:C# 3.0语法中,及更高版本中,还有可以使用lambda,声明实例化委托
        public void TestDemo4()
        {
            //接受一个类似的委托,匿名方式定义一个委托
            Del delinstance = name => {
                Console.WriteLine(name);
            };
            Del2 delinstance2 = name => {
                Console.WriteLine(name);
                return "要求有返回值";
            };
            var res=delinstance2("我是lambda方式,声明实例化,带返回值的");
            Console.WriteLine(res);
            //Del delinstance2 = Notify_;
        }
    }
}

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/how-to-declare-instantiate-and-use-a-delegate

出处如连接。

第二:什么是Ac'ti'o'n?

继承自delegate,本质就是一个特殊的委托,即一个参数名,无返回值特殊签名的委托,

https://docs.microsoft.com/zh-cn/dotnet/api/system.action-1?view=netcore-3.1

对应的action类型声明之后的赋值,有三种

常规,匿名,lambda

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskDemo
{
    class ActionDemo
    {
        //https://docs.microsoft.com/zh-cn/dotnet/api/system.action-1?view=netcore-3.1
        //封装一个方法,该方法只有一个参数且不返回值。
        public delegate void Action<in T>(T obj);
        //简单理解是某种特定类型的委托,即一个参数,无返回值的委托,不用单独声明如上,可直接使用:
        //public delegate void Action<in T>(T obj);

        public void TestDelegate() {
            //输出数组内容,以前的方式,当作复习委托
            List<string> names = new List<string>();
            names.Add("张三");
            names.Add("李四");
            //参数明显是需要一个Action类型,即特定委托
            names.ForEach(delegate (string name)
            {
                Console.WriteLine(name);
            });
            //必须是一个带一个参数,无返回值的函数签名,
            //因为里面就是接收一个Action委托
            names.ForEach(Notify);
        }
        public void Notify(string name) {
            Console.WriteLine("测试");
        }

        //!!!!!!!!!!这里重点是用Action非常简洁,用来声明特定类型的委托
        public void TestAction() {
            //第二种方式
            Action<string> actionDel = DemoAction;
            //第三种方式:
            Action<string> actionDel2 = delegate (string name) { };
            Action<string> actionDel3 = name => {

            };
        }
        public void DemoAction(string name) { 

        }
    }
}

 最后,最后,万丈高楼平地起,夯实基础,继续总结学习,进阶提高各种知识,技巧,

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值