`
ljl_xyf
  • 浏览: 633975 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#匿名方法讲解

    博客分类:
  • c#
阅读更多

  匿名方法是C#2.0引入的一个新特性,它允许开发者在线(inline)声明自己的函数代码而无须使用委托函数(delegate function。匿名方法通常在1. 需要一个临时方法,该方法使用次数极少;2. 这个方法的代码很短,甚至可能比方法声明都短的情况下使用。

 

  在C# 1.1里,声明和使用委托要求你有委托和一个在委托被触发时具有匹配签名的能够执行的方法,以及一个将命名方法与委托关联的分配语句。作为C# 2.0的新特性,匿名方法基本上能够提供与先前命名方法相同的功能,但是它已经不再需要一个在关联到委托之前就明确创建的方法了。   你可以把C# 匿名方法想象为一个实现与委托进行关联这项功能的便捷途径。如果同时看一下匿名方法实现和命名方法实现所取得IL结果,你会发现这两者之间的差别非常小。 当编译器碰到匿名方法的时候,它会在类里面创建一个命名方法,并将它与委托进行关联。所以匿名方法在运行期间与命名方法的性能非常类似——性能的增加体现 在开发人员的生产效率上,而不是运行期间的执行上。

 

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法。

要将代码块传递为委托参数,创建匿名方法则是唯一的方法。例如:

// Create a handler for a click event
button1.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("http://www.my400800.cn"); };

 

// Create a delegate instance
delegate void Del(int x);

// Instantiate the delegate using an anonymous method
Del d = delegate(int k) { /* ... */ };

 

 

如果使用匿名方法,则不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。

例如,如果创建方法所需的系统开销是不必要的,在委托的位置指定代码块就非常有用。启动新线程即是一个很好的示例。无需为委托创建更多方法,线程类即可创建一个线程并且包含该线程执行的代码。

 

void StartThread()
{
    System.Threading.Thread t1 = new System.Threading.Thread
      (delegate()
            {
                System.Console.Write("Hello, ");
                System.Console.WriteLine("http://www.my400800.cn");
            });
    t1.Start();
}
 

 

 

备注

匿名方法的参数的范围是 anonymous-method-block

在目标在块外部的匿名方法块内使用跳转语句(如 goto、break 或 continue)是错误的。在目标在块内部的匿名方法块外部使用跳转语句(如 gotobreakcontinue )也是错误的。

如果局部变量和参数的范围包含匿名方法声明,则该局部变量和参数称为该匿名方法的外部变量或捕获变量。例如,下面代码段中的 n 即是一个外部变量:

 

int n = 0;
Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };
 

与局部变量不同,外部变量的生命周期一直持续到引用该匿名方法的委托符合垃圾回收的条件为止。对 n 的引用是在创建该委托时捕获的。

匿名方法不能访问外部范围的 ref 或 out 参数。

anonymous-method-block 中不能访问任何不安全代码。

示例

下面的示例演示实例化委托的两种方法:

  • 使委托与匿名方法关联。

  • 使委托与命名方法 (DoWork ) 关联。

两种方法都会在调用委托时显示一条消息。

// Declare a delegate
delegate void Printer(string s);

class TestClass
{
    static void Main()
    {
        // Instatiate the delegate type using an anonymous method:
        Printer p = delegate(string j)
        {
            System.Console.WriteLine(j);
        };

        // Results from the anonymous delegate call:
        p("The delegate using the anonymous method is called.");

        // The delegate instantiation using a named method "DoWork":
        p = new Printer(TestClass.DoWork);

        // Results from the old style delegate call:
        p("The delegate using the named method is called.");
       //  p("欢迎访问:http://www.my400800.cn   400电话 办理网站.");    }

    // The method associated with the named delegate:
    static void DoWork(string k)
    {
        System.Console.WriteLine(k);
    }
}

 

输出:


The delegate using the anonymous method is called.

The delegate using the named method is called.

欢迎访问:http://www.my400800.cn    400电话 办理网站

 

分享到:
评论

相关推荐

    c#2.0的讲解,包括c#2.0简介,泛型,匿名方法,迭代器和不完全类的内容

    这个讲解将深入探讨这些关键特性,包括C# 2.0的简介、泛型、匿名方法、迭代器以及不完全类。 一、C# 2.0简介 C# 2.0是2005年发布的,它是.NET Framework 2.0的一部分。这个版本的目标是提高开发效率,增强类型安全...

    C#实例讲解源码.rar

    在本资源"C#实例讲解源码.rar"中,包含了200多个C#编程的实例,旨在帮助开发者全面了解和掌握C#语言的核心特性和应用。这些实例覆盖了C# 3.0版本的主要功能,提供了丰富的实践操作经验,对于初学者和有一定经验的...

    c#百例讲解

    8. **匿名方法与Lambda表达式**:C#支持匿名方法,即没有名称的函数,通常用于简化回调函数。Lambda表达式是匿名方法的更简洁形式,与LINQ查询结合使用尤为常见。 9. **LINQ(Language Integrated Query)**:C#的...

    c#经典教程讲解好

    还有匿名方法和lambda表达式,它们为编写简洁的代码提供了便利。此外,C#的泛型允许创建类型安全且可重用的数据结构,如List和Dictionary, TValue>。 在实际开发中,你可能会遇到并发和多线程问题。C#提供了一些...

    c#课件详细讲解

    13. **高级话题**:可能包括反射、委托、事件、属性、索引器、接口、抽象类、匿名方法、Lambda表达式等。 通过这套C#课件,学习者不仅可以获得理论知识,还能通过实例和练习来加深理解。对于教师来说,这些课件可以...

    C# 语法全解(很全的语法讲解)

    10. **C#语法**:这是一个综合性的文档,可能涵盖上述所有主题,并可能包含其他高级特性,如委托、事件、泛型、匿名方法、Lambda表达式、异步编程等。 通过这些文档的学习,开发者能够全面掌握C#语法,从而能够编写...

    C#中 委托的详细讲解

    在C#中,我们还可以使用匿名方法或者Lambda表达式来直接实例化委托,这使得代码更简洁: ```csharp Action, int> action = (a, b) => a + b; // 使用Lambda表达式创建委托 ``` **事件和委托** 委托在C#中的另一个...

    匿名方法、迭代器 匿名方法、迭代器

    首先,我们来详细讲解匿名方法。匿名方法是一种没有名字的函数,它可以直接在需要的地方定义并立即调用,无需事先声明。这种特性使得代码更加紧凑,减少了冗余。在C#中,匿名方法使用lambda表达式表示,形式如下:`...

    C# 应用编程讲解

    5. **泛型**:允许创建类型参数化的类、接口和方法,提高代码的灵活性和复用性。 6. **LINQ(Language Integrated Query)**:内置于语言中的查询表达式,使得数据查询更简洁高效。 7. **异步编程**:通过async和...

    C#语法详细讲解(初学者)

    本教程将针对初学者,深入浅出地讲解C#的基础语法和核心概念。 一、C#基础 1. 变量与数据类型:C#支持多种数据类型,包括基本类型(如int、float、bool等)、引用类型(如类、接口、数组)以及值类型(如结构)。...

    C#课件,讲解C#的入门到应用,可以作为教学课件

    6. **高级特性篇**:涵盖委托、事件、Lambda表达式、Linq(语言集成查询)、匿名方法和异步编程等C#的高级特性。 7. **.NET Framework与Windows应用篇**:介绍如何利用.NET框架开发Windows Forms和WPF应用,以及UI...

    C#面向对象教程ppt讲解

    它的语法简洁且强大,支持许多高级特性,如泛型、匿名方法、LINQ(Language Integrated Query)等。C#的面向对象特性包括类、对象、封装、继承、多态等。 在面向对象编程(OOP)中,类是对象的蓝图,描述了对象的...

    C#2.0 锐利体验系列课程(2):匿名方法、迭代器.wmv

    C#2.0 锐利体验系列课程(2):匿名方法、迭代器。官方讲解,清晰直接。收藏多年,分享给大家。C#2.0经典

    C# 语法全解(讲解详细易懂)

    C#还支持匿名函数和lambda表达式,使得代码更加简洁。 类是C#面向对象编程的基础,它封装了数据和操作这些数据的方法。通过使用class关键字定义类,实例化对象是通过new关键字完成的。继承允许一个类(子类)从另一...

    c#课件基础知识讲解

    C#还支持匿名函数和lambda表达式,它们在编写简洁高效的代码时非常有用。 C#中的控制流结构包括条件语句(if-else,switch-case)和循环(for,while,foreach)。学习如何使用这些结构来控制程序的执行流程。 ...

    C#经典范例50讲讲解了许多c#常用的例子

    12. **委托和匿名方法**:学习如何使用委托和匿名方法编写事件处理程序,以及Lambda表达式的应用。 13. **多线程和并发**:了解如何在C#中创建和管理线程,以及使用Mutex、Semaphore等同步原语防止竞态条件。 14. ...

    详细说明c#中的方法的调用问题

    本篇文章将详细讲解C#中的方法调用及其相关知识点,适合初学者理解掌握。 一、方法定义与声明 在C#中,方法由关键字`void`或返回类型、方法名、参数列表(可选)和方法体组成。例如,一个简单的无参数无返回值的...

    C#完全手册 C#基础讲解

    - 静态与实例方法:静态方法属于类,而实例方法属于对象,两者调用方式不同。 - 装箱与拆箱:将值类型转换为引用类型(装箱)和反之(拆箱)的过程。 3. **.NET框架** - 应用程序域:应用程序域提供了一个安全和...

    插图详解C# 2008(用插图的方式讲解C#2008)

    在C# 2008版本中,引入了一些新特性,如匿名方法、LINQ(Language Integrated Query)和自动属性等,这些都极大地提高了代码的可读性和编写效率。书中通过生动的插图,将这些复杂的概念以直观的方式展现出来,使读者...

    C#沉淀之委托的深入讲解

    自C# 3.0引入的匿名方法和Lambda表达式简化了委托的使用,可以直接在声明委托实例时定义方法: ```csharp MyDel del = (int value) => Console.WriteLine(value + " - Anonymous"); ``` 7. **事件处理** 在C#...

Global site tag (gtag.js) - Google Analytics