[C#] C# 基础回顾 - 匿名方法 C# 知识回顾 - 序列化 C# 知识回顾 - 表达式树 Expression Trees C# 知识回顾 - 特性 Attribute 剖析 Assembly

C# 基础回顾 - 匿名方法

目录

  • 简介
  • 匿名方法的参数使用范围
  • 委托示例

 

简介

  在 C# 2.0 以前的版本中,咱们建立委托的惟一形式 -- 命名方法。html

  而 C# 2.0 -- 引进了匿名方法,在 ≥ C# 3.0 的版本中,咱们会用 Lambda 表达式进行取代匿名方法,而且用 Lambda 表达式做为编写内联代码的首选方式,由于它更简洁。函数

 

  匿名方法是,顾名思义,匿名方法就是没有名称的方法。匿名方法最明显的好处就是:能够下降额外另写一个方法的工做量;另一个好处就是能够直接访问调用者的变量,从而下降传参的复杂度。post

  匿名方法,它不是一个事先定义的方法,而是使用一个委托的代码块,在使用时,和普通方法并无什么区别,可是匿名方法能够在必定程度上减小系统开销。编码

  匿名方法,关键字:delegate。url

  匿名方法,使用场景:一般在,①须要一个临时的方法,而且该方法使用的次数极少;②该方法的代码很短,不长。spa

  

  【注意】有一种状况,匿名方法它提供了 Lambda 表达式所没有具有的功能。 那就是,你可使用匿名方法来忽略参数列表。 这意味着匿名方法能够转换为具备各类签名的委托,而这些,对于 Lambda 表达式来讲,几乎是彻底不可能的。线程

 

  想要将代码块做为委托参数进行传递,使用匿名方法是目前惟一的方式。 code

  示例一:htm

        // 建立一个点击事件
        button1.Click += delegate(Object o, EventArgs e)
                           { MessageBox.Show("Click!"); };

 

  示例二:对象

    // 建立一个委托.
    delegate void MyDel(int x);

    // 使用匿名方法并将委托实例化
    MyDel del = delegate(int k) { /* ... */ };

 

  使用匿名方法,因为无需单独额外建立方法,从而减小了上述两个示例实例化委托所须要的编码开销。

  例如,若是建立方法所需的系统开销并非必要的,则指定代码块(而不是委托)就会很是有用。

 

  我在这里经过一个示例演示,如何用一个匿名方法的形式建立并启动一个新的线程:

   //新建线程启动的示例   
   void Start() {
     //声明 Thread thread
= new Thread (delegate() { Write("Hello, "); WriteLine("Fanguzai!"); });

     //启动 thread.Start(); }

 

匿名方法的参数使用范围

  匿名方法的参数使用范围:匿名方法块。

  若是目标在块外部,你在匿名块内部使用 -- 跳转的关键字(相似 goto/break/continue),就是错误的;若是目标在块内部,你在匿名块外部使用 -- 跳转的关键字(相似 goto/break/continue),也是错误的。

  若是局部变量和参数的范围已经包含匿名方法声明,则该局部变量和参数将被称为该匿名方法的“外部”(外界)变量。你看,这个代码段中的 num 就是一个外部(外界)变量:

        int num = 250;
        MyDel del = delegate() { WriteLine("#:{0}", --num); };

  

  这个外部变量的所引用的 num,将会被认为是在建立委托时进行捕获的,它与咱们经常使用的本地变量不一样,这个外部变量的生存期 -- 引用该匿名方法的委托对象被 .NET 的 CLR 的垃圾回收机制进行回收。

 

  【注意】匿名方法没法访问外部(外界)范围内,带 ref 与 out 关键字的参数。

  【注意】在匿名块中不能访问 unsafe 的代码。

  【注意】在 is 运算符的左边,是用不了匿名的方法的。

 

委托示例

  下面的示例,将会同时使用匿名方法和命名方法去调用委托时:

    // 声明委托
    delegate void MyDel(string s);

    class MyClass
    {
        static void Main()
        {
            // 使用匿名方法实例化委托
            MyDel p = delegate (string msg)
            {
                Console.WriteLine(msg);
            };

            // 直接调用
            p("使用匿名方法调用委托。");


            // 上面的形式再简写
            p = Console.WriteLine;
            Console.WriteLine("上面简写的形式");


            // 使用"Do"的静态方法的委托实例化。
            p = new MyDel(MyClass.Do);
            // 使用旧的风格调用委托
            p("使用命名方法调用委托。");


            Console.Read();
        }

        // 后续用于委托调用
        static void Do(string msg)
        {
            Console.WriteLine(msg);
        }
    }

 

C# 基础回顾系列

  《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)

  《C# 知识回顾 - 事件入门》、《C# 知识回顾 - Event 事件

  《string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

  《C# 知识回顾 - 你真的懂异常(Exception)吗?

  《了解过入口函数 Main() 吗?带你用批处理玩转 Main 函数

 

 


【博主】反骨仔

【出处】http://www.cnblogs.com/liqingwen/p/6216494.html 

【参考】微软官方文档

相关文章
相关标签/搜索