详细记录 委托、匿名方法到lambda的=>转变过程

详细记录 委托、匿名方法到lambda的=>转变过程

一、委托

1、什么是委托 即将方法声明一个变量形式的别名

例如 委托类型 变量名= new 委托类型(方法名)// 不懂就先看代码

class Program
    {
        //1、定义委托
        delegate void MYdelegate(int x1, int x2);
        static void Main(string[] args)
        {
            MYdelegate d;//声明委托变量
            //Program()是构造函数 实例化Program类  
            //委托变量d绑定Add方法 就是包装/别名 即d就是add方法
            d = new MYdelegate(new Program().Add);
            d(3,4); //例如  可以这样调用
            MyMethod(d);//也可以将委托变量当参数传递
            Console.ReadKey();

        }

        //委托的方法 方法的定义与委托相同 即返回类型和参数的类型、个数相同
        void Add(int x1, int x2)
        {
            int sum = x1 + x2;
            Console.WriteLine("两个数的和为:" + sum);
        }
        //方法参数是委托类型
        private static void MyMethod(MYdelegate myd)
        {
            //在方法中调用委托
            myd(1, 2);
        }
    }

委托就是方法定义一个别名 或者说包装成一个变量了 且可以作为参数传递给其他方法

2、常用的Func委托(系统定义好了 直接用于封装方法 比较常用)
Func委托:可以带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。

public delegate TResult Func<in T, out TResult>(T arg);
//Func后面可以跟很多类型,最后一个类型则是返回值类型
//前面的类型为参数类型
static int Test2(string str)
{
    Concole.WriteLine(str);
    return 1;
}
static void Main()
{
    Func<stirng, int> a = Test2;
    Concole.WriteLine(a("Test"));
}

Func委托 只是将委托给封装一下 改变了形式 将参数和返回类型封装成泛型T

二、匿名方法

1、什么是匿名方法
就是没有定义名字的方法 因为没有名字所以只能在定义的时候被调用

例1、有名字的方法

        delegate void VoteDelegate(string name);
        static void Main(string[] args)
        {

            VoteDelegate voteDelegate = new VoteDelegate(new Friend().Vote);
            voteDelegate("Somebody");
            Console.Read();
        }
        public class Friend
        {
            public void Vote(string nickname)
            {
                Console.WriteLine("姓名为:{0}来帮我你投票啦", nickname);
            }
        }

改写例1
将Vote方法变成匿名函数

 delegate void VoteDelegate(string name);
        static void Main(string[] args)
        {

            VoteDelegate voteDelegate = delegate (string nickname)
            {
                Console.WriteLine("姓名为:{0}来帮我你投票啦", nickname);
            };
            voteDelegate("Somebody");
            Console.Read();
        }

三、Lambda表达式的演变 =>

1、=>读作 “goes to”
个人理解:lambda表达式就是匿名方法和委托的结合

  static void Main(string[] args)
        {
            //C#1.0   创建参数为string返回类型为int 的委托实例
            Func<string, int> delegatetest1 = new Func<string, int>(Callbackmethod);
            //C#2.0   用匿名方法创建委托实例
            Func<string, int> delegatetest2 = delegate (string text)
            {
                return text.Length;
            };
            //C#3.0
            Func<string, int> delegatetest3 = (string text) => text.Length;

            //可以省略参数
            Func<string, int> delegatetest4 = (text) => text.Length;
            //
            Func<string, int> delegatetest5 = text => text.Length;

            Console.WriteLine("使用lambda表达式返回字符传的长度为:"+delegatetest5("sabcjbcsnbavb"));
            Console.Read();
        }
        //委托的回调方法
        private static int Callbackmethod(string text)
        {
            return text.Length;
        }

原本的表达式越来越简洁 但更不容易理解啦
只需要记住 “=>”的做左边是参数 右边是表达式即函数主体就好啦

四、简单的应用

 delegate int myDel(int a);
        static void Main(string[] args)
        {

            myDel myDelegate = x => x * x;
            int j = myDelegate(5);
            Console.Write(j);
            Console.ReadKey();
        }

或者

 static void Main(string[] args)
        {
            Func<int, int> myDeint;
            myDeint = x => x * x;
            int j = myDeint(5);
            Console.Write(j);
            Console.ReadKey();
        }

以上两个输出结果都是25
可以对比一下 Func和delegate的用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值