zoukankan      html  css  js  c++  java
  • C#基础加强篇---委托、Lamada表达式和事件(中)

    2.Lamada表达式

        C#共有两种匿名函数:匿名方法和Lamada表达式。在2.0之前的C#版本中,创建委托的唯一方法是使用命名方法。C#2.0中引入了匿名方法,匿名方法就是没有名称的方法。从C#3.0开始,就可以使用一种新语法把实现代码赋予委托——Lamada表达式。

          在了解Lamada表达式之前,我们先来了解一下匿名方法。用匿名方法定义委托的语法与之前的没有区别,但在实例化时就有了一些区别。

          使用命名方法创建的委托

     1  class Program
     2     {
     3         private delegate void DelSayHi(string name);//定义委托
     4         static void Main(string[] args)
     5         {
     6             Test("张三", SayHelloByChinese);
     7             Test("Zhang San", SayHelloByEnglish);
     8         }
     9         static void Test(string name, DelSayHi del)
    10         {
    11             del(name);
    12         }
    13         static void SayHelloByEnglish(string name)
    14         {
    15             Console.WriteLine("Hello ," + name);
    16         }
    17         static void SayHelloByChinese(string name)
    18         {
    19             Console.WriteLine("你好," + name);
    20         }
    21     }


          使用匿名方法创建的委托

     1   class Program
     2     {
     3         private delegate void DelSayHi(string name);//定义委托
     4         static void Main(string[] args)
     5         {
     6             Test("张三", delegate(string name)
     7             {
     8                 Console.WriteLine("你好," + name);
     9             });
    10             Test("Zhangsan", delegate(string name)
    11             {
    12                 Console.WriteLine("Hello," + name);
    13             });    
    14         }
    15         static void Test(string name, DelSayHi del)
    16         {
    17             del(name);
    18         }  
    19     }

          匿名方法的优点是减少了代码的编写,不必定义仅由委托调用的方法。使用匿名方法时,编译器仍定义了一个方法,该方法只有一个自动指定的名称,我们不需要知道。使用匿名方法时,我们应遵循两条规则:一是在匿名方法中不能使用跳转语句(break,goto或continue)跳到该匿名方法的外部,反之,匿名方法外部的跳转语句不能跳到匿名方法的内部。二是在匿名方法内部不能访问不安全的代码,也不能访问在匿名方法外部使用的ref和out参数,但可以在匿名方法中使用外部定义的其他变量。

         好了,我们再来了解Lamada表达式。。。。

         若要创建 Lambda 表达式,需要在 Lambda 运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。

         示例1:

     1  class Program
     2     {
     3         delegate int del(int i);
     4         static void Main(string[] args)
     5         {
     6             del myDelegate = x => x * x;
     7             int j = myDelegate(5); //j = 25
     8             Console.WriteLine(j.ToString());
     9         }
    10     }

         示例2:

    nam

         示例3:

     1  static void Main(string[] args)
     2         {
     3             string mid = ",middle part,";
     4 
     5             Func<string, string> lamada = (string param) =>  
     6             {
     7                 param += mid;
     8                 param += " end of string.";
     9                 return param;
    10             };
    11             Console.WriteLine(lamada("Start of string "));
    12         }

        为了简便,示例2和3中name和param的类型string也可以省略不写。只有一个参数,只用写出参数名就行了。如果委托使用多个参数,就把参数名放在括号里。
                string mid = ",middle part,";

                Func<string,string, string> lamada = (start,end) => 
                {
                    start += mid;
                    end =start+end;
                    return end;
                };
                Console.WriteLine(lamada("Start of string "," end of string."));

         还有如果Lamada表达式只有一条语句,在方法块内就不需要花括号和return语句,此时编译器会添加一条隐式的return语句。如示例1,它相当于  del myDelegate = x =>{ return x * x; };如果在Lamada表达式的实现代码中有多条语句,就必须添加花括号和return语句。

        有点玩了,先睡觉,事件留到下篇吧。。。。晚安

  • 相关阅读:
    小程序开发学习
    guava 学习一 函数,集合操作
    《构建之法》第四章 两人合作 读后感
    模拟退火学习笔记
    Haywire
    [JSOI2004]平衡点
    CF1039D You Are Given a Tree
    CF797E Array Queries
    [SHOI2014]三叉神经树
    [国家集训队]Tree II
  • 原文地址:https://www.cnblogs.com/czhwust/p/4355057.html
Copyright © 2011-2022 走看看