C# Delegate委托、Lambda表达式

  • Delegate委托是一个方法型参数,它写入方法A的参数括号里,然后在调用方法A时,需要在方法A的参数括号里填入一个方法B来做为参数,这个方法B就是Delegate委托的位置。
  • 这个方法B可以先写好再调进去,也可以用Lambda表达式当场写进去(简化)。
  • Delegate委托的作用是什么,为什么需要委托?
  • 因为有一个问题要解决,我们写一个方法时,会设定一个参数,这样可以传入不同参数,而输出不同的值。
  • 但是,如果我们要写一个方法,该方法可以传入不同参数来调用三种不同的方法,当然,这个可以用switch来实现,但这样多一步,而且维护麻烦。
  • 为了解决这个问题,就引入了“方法参数”这个东西,就是把方法作为一个参数来传递。正常的方法的参数不能是方法的,所以就有了委托,来实现把方法作为参数这件事情。
public delegate void SpeakLanguageDelegate(string name);

public void SpeakLanguage(string name, SpeakLanguageDelegate speakLanguageDelegate)
{
 speakLanguageDelegate(name);
}

LanguageSpeak languageSpeak = new LanguageSpeak();
languageSpeak.SpeakLanguage("陈桃", languageSpeak.SpeakChinese);
languageSpeak.SpeakLanguage("Allen",languageSpeak.SpeakEnglish);
languageSpeak.SpeakLanguage("Orvde", languageSpeak.SpeakFrench);
  • 来看一下代码,参数string name会传导给speakLanguageDelegate(name);可以把它看成是一个虚方法,最终用什么方法,由SpeakLanguageDelegate这个委托参数来决定。
  • 所以,在SpeakLanguage方法体里面,Delegate是一个虚方法,就是该委托方法,有点像重载override的意思。然后,你也可以用其他方法与该虚方法拼接,或者直接写入几条其他实方法,和抽象方法的操作类似。这些实方法是公用的,而虚方法要选择其一来用,所以虚方法每个人都不同。
  • 所以,Delegate生来就是一个参数,看到一个Delegate就去找它用在哪个参数的位置里面。但Delegate它自己的参数呢?如果Delegate有参数,说明调用Delegate的方法的参数会有两个,而这两个参数的实际意义是不同的,比如上面的string name是一个参数,SpeakLanguageDelegate speakLanguageDelegate是一个参数,但是,前者是传递一个数值去参与运算,而后者是一个选择题,它不参与运算,只是单纯做一个选择就结束了。
  • 关于这两种参数,还有一点,就是string name可以不写在方法参数括号里,可以直接写一个确定的name到方法体里的Delegate参数括号里,这样虽然调用的方法不同,但参数会用一样的。
  • 那Delegate可以选择哪些范围的方法呢?它是跟着类走的,你在A类中定义一个Delegate,那么就可以选择这个A类中的方法。
 class Program
    {
        delegate int AddHandler(int x, int y, int z);

        static int GeRen(int a, int b, int c)
        {
            int z = a + b + c;
            return z;
        }

        static void ZongFen(int a, int b, int c)
        {
            Console.WriteLine(GeRen(a, b, c) * 2);
        }

        static void ZongFen2(int a, int b, int c, AddHandler add)
        {
            Console.WriteLine(add(a, b, c) * 2);
        }

        static void ZongFen3(AddHandler add)
        {
            Console.WriteLine(add(1, 2, 3) * 2);
        }


        static void Main(string[] args)
        {
            //Print(x => x + 2);
            //Print((x, y) => x + y);
            //Print((x, y) => { int v = x * 10; return y + v; });

            ZongFen(1, 2, 3);
            ZongFen2(1, 2, 3, GeRen);
            ZongFen2(1, 2, 3, (a, b, c) => a + b + c);
            ZongFen3((a, b, c) => a + b + c);

            Console.ReadKey();
        }

        //运行结果是12   12   12   12
        //四个都是12,他们的方法是等效的

    }
  • 注意上面代码中,Print(x => x + 2);当前面只有一个参数时,省略括号,后面只有一个运算是,省略大括号和return。
  • 上面四种ZongFen方法是等效的,说明了他们之间的替代作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值