`
isiqi
  • 浏览: 16538460 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

匿名方法---将代码块作为参数传递给委托

阅读更多

2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。匿名方法使您能够省略参数列表,这意味着可以将匿名方法转换为带有各种签名的委托。这对于 Lambda 表达式来说是不可能的。

将代码块传递为委托参数,创建匿名方法则是唯一的方法。这里是两个示例:

1

Form上拖放一个Button按钮


书写相关代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WinApp

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

//创建click事件的处理。+=合并委托。将代码块传递为委托参数

button1.Click += delegate(System.Object o, System.EventArgs e2)

{

System.Windows.Forms.MessageBox.Show("你好,委托!");

};

}

private void button1_Click(object sender, EventArgs e)

{

MessageBox.Show("委托示例");

}

}

}

运行结果,先显示“委托示例”,再显示“你好,委托”

2

//声明委托

delegate void Printer(string s);

//中间代码略,完整代码看最后示例

//利用匿名方法,实例化一个委托

Printer p2=delegate(string s)

{

Console.WriteLine(s);

};

p2("我是中国人,我爱编程。(使用匿名方法)");

备注

匿名方法的参数的范围是“匿名方法块”。

如果目标在块外部,那么,在匿名方法块内使用跳转语句(如 gotobreak continue)是错误的。如果目标在块内部,在匿名方法块外部使用跳转语句(如 gotobreak continue)也是错误的。

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

例:

delegate void Del();

//中间代码略,完整代码看最后示例

//利用该匿名方法的“外部”变量n

int age = 20;

Del p3 = delegate()

{

Console.WriteLine("年龄:{0}", age);

};

p3();

输出:年龄:20

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

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

在“匿名方法块”中不能访问任何不安全代码。

is 运算符的左侧不允许使用匿名方法。

示例

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

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

使委托与匿名方法关联。

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace MvcUsedKeywords

{

//声明委托

delegate void Printer(string s);

delegate void Del();

class TestDelegate2

{

static void Main(string[] args)

{

//利用已命名的方法DoWork(),实例化一个委托

Printer p1 = new Printer(TestDelegate2.DoWork);

p1("我是中国人,我爱编程。(使用命名方法)");

//利用匿名方法,实例化一个委托

Printer p2=delegate(string s)

{

Console.WriteLine(s);

};

p2("我是中国人,我爱编程。(使用匿名方法)");

//利用该匿名方法的“外部”变量age

int age = 20;

Del p3 = delegate()

{

Console.WriteLine("年龄:{0}", age);

};

p3();

}

static void DoWork(string s)

{

Console.WriteLine(s);

}

}

}

运行结果:

我是中国人,我爱编程。(使用命名方法)

我是中国人,我爱编程。(使用匿名方法)

年龄:20

分享到:
评论

相关推荐

    C#委托及匿名方法详解

    委托与匿名方法的结合使用,使得在不定义额外的方法的情况下,能够将代码块作为参数传递。这在事件处理、异步操作等场景中极为有用。 例如: ```csharp MathsOp operation = delegate(double value) { // 这里...

    委托匿名方法LAMDA表达式

    匿名方法是在不创建单独方法的情况下直接定义的代码块,它可以被赋值给一个委托实例。这种功能在需要临时、简短的代码逻辑时非常方便。匿名方法有两种形式:普通匿名方法和简化匿名方法。 普通匿名方法示例: ```...

    c#2_0匿名方法三(转)

    匿名方法是C#引入的一种新特性,它允许我们在不定义单独的方法的情况下直接使用代码块作为参数,或者在需要的地方直接创建委托实例。这种特性在处理事件处理或需要简洁代码的场合非常有用。 首先,我们要理解什么是...

    C#中的delegate委托类型基本学习教程

    - 自C# 2.0起,匿名方法允许在没有定义单独方法的情况下,直接将代码块作为参数传递,这在委托使用中非常方便。 - C# 3.0引入的Lambda表达式进一步简化了这个过程,提供了一种更简洁的方式来编写内联代码块,它们...

    C#委托的使用方法(Demo)

    它们允许我们将方法作为参数传递给其他方法,或者将方法存储在变量中以便稍后调用。这为实现事件处理、回调函数以及函数式编程风格提供了基础。下面将详细探讨在给定的标题和描述中提到的几个关键知识点。 ### 1. ...

    初步理解委托、事件、匿名方法和Lambda1

    委托是.NET框架中的一种强大的特性,它允许我们将方法当作参数传递,或者将多个方法捆绑在一起形成一个执行列表。在C#中,委托类是基于`System.Delegate`基类的,它们代表对特定方法的引用。理解委托的概念,我们...

    objective-c基础开发教程源代码

    - Block是Objective-C中的匿名函数,可以作为参数传递,也可以作为返回值。 9. **Foundation框架**: - Objective-C的基础框架,提供了诸如字符串、数组、字典等基本数据类型的实现。 10. **Core Foundation和...

    C#委托 C#委托 C#委托

    在C#编程语言中,委托(Delegate)是一种强大的特性,它允许我们把方法作为参数传递,或者存储在变量中,从而实现回调函数和事件处理。本文将深入探讨C#委托的概念、用途、类型以及如何使用`DynamicInvoke`方法。 #...

    C#委托demo C#委托demo

    在C#编程语言中,委托是一种强大的特性,它允许我们将方法作为参数传递,或者存储在变量中以便稍后调用。这种设计模式是C#事件处理和回调机制的基础,极大地提高了代码的灵活性和可扩展性。本文将深入探讨C#委托的...

    c#2_0匿名方法一(转)

    在C#编程语言中,匿名方法是一个非常重要的特性,尤其在C# 2.0版本中引入,它允许程序员在不定义显式函数的情况下直接传递代码块作为参数。这一特性大大提高了代码的简洁性和可读性,特别是在处理事件或者需要进行...

    c#委托机制全面细致分析源代码

    C#中的委托是一种强大的特性,它允许我们定义和使用类似于函数指针的类型,使得可以将方法作为参数传递,或者存储在数据结构中以便稍后调用。这为实现事件处理、回调函数以及构建异步编程模型提供了基础。本文将深入...

    C#基本函数代码C#基本函数代码C#基本函数代码

    方法是实现特定逻辑的代码块,而委托则代表对方法的引用,允许我们传递行为作为参数。 1. **方法定义与调用**: - 方法定义通常包含访问修饰符(如public、private等)、返回类型、方法名以及参数列表。例如: ``...

    从方法到委托及Lambda的演变.rar

    委托可以用于事件处理,或者作为参数传递给其他方法,实现回调机制。下面是一个简单的委托示例: ```csharp public delegate int MyDelegate(int x, int y); ``` 然后,我们可以定义一个使用这个委托的方法,并...

    C#委托详解—还有代码奉上

    委托作为参数传递 在C#中,可以将委托作为方法的参数,这在事件处理、回调函数等场景中非常常见。例如,定义一个使用委托作为参数的方法: ```csharp void ProcessData(MyDelegate action, int data) { int ...

    C#用匿名方法定义委托的实现方法

    这使得可以在不直接调用方法的情况下,将方法作为参数传递或者存储在变量中。匿名方法是C#提供的一种特殊方式,允许我们在不创建单独命名的方法时定义并立即使用方法。在本篇中,我们将深入探讨如何使用匿名方法来...

    C#2.0新的语法扩充(泛型,迭代器,匿名方法)

    匿名方法是在C#2.0中引入的一种可以在不定义单独的方法的情况下传递代码块作为参数的功能。它们通常用于事件处理或者作为委托的实例。 ##### 优点: - **代码紧凑性**:无需为简单的操作编写单独的方法。 - **灵活...

    多播委托,并解决多播委托出现异常,不能迭代

    在.NET框架中,委托是一种类型安全的函数指针,它允许我们传递方法作为参数或存储一组方法以供后续调用。多播委托是委托的一种特殊形式,它允许一个委托实例关联多个方法。当我们说“多播委托”,我们指的是一个委托...

    Objective-C基础教程及源代码

    7. **块(Block)**:块是Objective-C中的匿名函数,可以捕获并存储执行上下文中的局部变量。它们在多线程编程和异步操作中非常有用。 8. **Foundation框架**:Objective-C的基石,提供了诸如字符串、数组、字典等...

    一本讲解c#语言规范的书,写的很详细(第二部分)

    - 匿名方法是一种没有名称的方法,它可以在声明时被定义并传递给事件处理程序或作为委托类型的实例。 - **1.2.1 方法组转换** - 方法组转换是指将非静态方法转换为相应类型的委托的过程。 - **1.3 迭代器** - ...

    objective-c 程序设计 + 代码

    5. **块(Blocks)**:Objective-C引入了块的概念,它是一种可以捕获和存储局部变量的匿名函数,常用于异步操作回调。 二、Objective-C语法 1. **实例变量(Instance Variables)**:使用`@property`和`@...

Global site tag (gtag.js) - Google Analytics