当前位置: 首页 > news >正文

门户网站啥意思北京 设计 网站建设

门户网站啥意思,北京 设计 网站建设,为 wordpress 的评论链接加上 nofollow,网站开发与维护就业前景文章目录 前言一、闭包的基本概念二、匿名函数中的闭包1、定义和使用匿名函数2、匿名函数捕获外部变量3、闭包的生命周期 三、Lambda 表达式中的闭包1、定义和使用 Lambda 表达式2、Lambda 表达式捕获外部变量3、闭包的作用域 四、闭包的应用场景1、事件处理2、异步编程3、迭代…

文章目录

  • 前言
  • 一、闭包的基本概念
  • 二、匿名函数中的闭包
    • 1、定义和使用匿名函数
    • 2、匿名函数捕获外部变量
    • 3、闭包的生命周期
  • 三、Lambda 表达式中的闭包
    • 1、定义和使用 Lambda 表达式
    • 2、Lambda 表达式捕获外部变量
    • 3、闭包的作用域
  • 四、闭包的应用场景
    • 1、事件处理
    • 2、异步编程
    • 3、迭代器和 LINQ 查询
  • 五、闭包的注意事项
    • 1、变量捕获的副作用
    • 2、闭包的性能影响
    • 3、闭包的内存管理
  • 六、总结


前言

  在 C# 中,闭包是一个强大的概念,它允许函数捕获外部变量并在函数外部访问这些变量。闭包在很多场景下都非常有用,比如在匿名函数、Lambda 表达式和委托中。本教程将详细介绍 C# 中的闭包。
在这里插入图片描述

一、闭包的基本概念

  闭包是一种将函数与其周围的环境(即外部变量)封装在一起的技术。在 C# 中,闭包通常是通过匿名函数或 Lambda 表达式实现的。当一个匿名函数或 Lambda 表达式引用了外部变量时,这个变量就被 “捕获” 到了闭包中,并且可以在函数内部访问和修改。

二、匿名函数中的闭包

1、定义和使用匿名函数

delegate int AnonFunc();
AnonFunc func = delegate()
{return 10;
};

  匿名函数是一种没有名称的函数,它可以在代码中直接定义并使用。在 C# 中,匿名函数通常使用delegate关键字或 Lambda 表达式来定义。例如:
  在这个例子中,我们定义了一个匿名函数,并将其赋值给一个委托变量。这个匿名函数没有参数,并且返回值为 10。

2、匿名函数捕获外部变量

  匿名函数可以捕获外部变量,并在函数内部访问和修改这些变量。例如:

int x = 5;
delegate int AnonFunc();
AnonFunc func = delegate()
{return x;
};

  在这个例子中,匿名函数捕获了外部变量x,并在函数内部返回了这个变量的值。

3、闭包的生命周期

delegate int AnonFunc();
int x = 5;
AnonFunc func = delegate()
{return x;
};
x = 10;
Console.WriteLine(func());

  闭包的生命周期与捕获它的委托或 Lambda 表达式的生命周期相同。这意味着,只要委托或 Lambda 表达式存在,闭包就存在,并且可以访问和修改捕获的变量。例如:
  在这个例子中,我们首先定义了一个匿名函数,它捕获了外部变量x。然后,我们修改了变量x的值,并调用了匿名函数。由于闭包的存在,匿名函数返回了修改后的变量x的值。

三、Lambda 表达式中的闭包

1、定义和使用 Lambda 表达式

  Lambda 表达式是一种简洁的匿名函数语法,它可以在代码中直接定义并使用。在 C#中,Lambda 表达式通常使用=>运算符来定义。例如:

   Func<int> func = () => 10;

  在这个例子中,我们定义了一个 Lambda 表达式,并将其赋值给一个委托变量。这个 Lambda 表达式没有参数,并且返回值为 10。

2、Lambda 表达式捕获外部变量

int x = 5;
Func<int> func = () => x;

  Lambda 表达式可以捕获外部变量,并在函数内部访问和修改这些变量。例如:
  在这个例子中,Lambda 表达式捕获了外部变量x,并在函数内部返回了这个变量的值。

3、闭包的作用域

  闭包中的变量的作用域与捕获它的 Lambda 表达式的作用域相同。这意味着,只要 Lambda 表达式存在,闭包就存在,并且可以访问和修改捕获的变量。例如:

int x = 5;Func<int> func = () => x;x = 10;Console.WriteLine(func());

  在这个例子中,我们首先定义了一个 Lambda 表达式,它捕获了外部变量x。然后,我们修改了变量x的值,并调用了 Lambda 表达式。由于闭包的存在,Lambda 表达式返回了修改后的变量x的值。

四、闭包的应用场景

1、事件处理

Button button = new Button();
int count = 0;
button.Click += (sender, e) =>
{count++;Console.WriteLine($"Button clicked {count} times.");
};

  闭包在事件处理中非常有用,因为它可以捕获事件发生时的上下文信息。例如,在 WPF 或 WinForms 应用程序中,我们可以使用闭包来处理按钮点击事件,并访问按钮的属性或其他上下文信息。例如:
  在这个例子中,我们使用闭包来处理按钮的点击事件。闭包捕获了外部变量count,并在每次按钮点击时增加这个变量的值,并在控制台上输出点击次数。

2、异步编程

  闭包在异步编程中也非常有用,因为它可以捕获异步操作发生时的上下文信息。例如,在使用asyncawait关键字进行异步编程时,我们可以使用闭包来访问异步操作的结果或其他上下文信息。例如:

   async Task<int> GetDataAsync(){await Task.Delay(1000);return 10;}int x = 5;Func<int> func = async () =>{int data = await GetDataAsync();return x + data;};int result = await func();Console.WriteLine(result);

  在这个例子中,我们使用闭包来访问异步操作的结果。闭包捕获了外部变量x,并在异步操作完成后将其与异步操作的结果相加,并返回结果。

3、迭代器和 LINQ 查询

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int sum = 0;
foreach (int number in numbers)
{sum += number;
}
Console.WriteLine(sum);

  闭包在迭代器和 LINQ 查询中也非常有用,因为它可以捕获迭代器或查询的上下文信息。例如,在使用foreach循环或 LINQ 查询时,我们可以使用闭包来访问迭代器或查询的当前元素或其他上下文信息。例如:
  在这个例子中,我们使用foreach循环来遍历一个整数列表,并将每个元素累加到一个变量中。在循环内部,我们使用闭包来捕获外部变量sum,并在每次迭代时将当前元素累加到这个变量中。

五、闭包的注意事项

1、变量捕获的副作用

  闭包捕获外部变量可能会导致一些意想不到的副作用。例如,如果捕获的变量是一个引用类型,并且在闭包内部修改了这个变量的值,那么这个修改可能会影响到其他地方对这个变量的引用。例如:

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };Func<List<int>> func = () => numbers;numbers.Add(6);Console.WriteLine(func().Count);

  在这个例子中,我们定义了一个闭包,它捕获了外部变量numbers。然后,我们在闭包外部修改了这个变量的值,并调用了闭包。由于闭包捕获了外部变量,所以闭包返回的列表也包含了修改后的元素。

2、闭包的性能影响

  闭包可能会对性能产生一些影响,因为它们需要捕获外部变量并在堆上分配内存。在一些性能敏感的场景下,我们可能需要考虑避免使用闭包或者使用其他技术来替代闭包。例如,在一些高性能的计算场景下,我们可以使用结构体而不是类来避免闭包的性能开销。

3、闭包的内存管理

  闭包可能会导致内存泄漏,因为它们可能会捕获外部变量并保持对这些变量的引用。在一些长时间运行的应用程序中,我们需要注意闭包的内存管理,避免不必要的内存泄漏。例如,在使用事件处理时,我们需要注意在不再需要事件处理时取消订阅事件,以避免闭包的内存泄漏。

六、总结

  闭包是 C# 中一个强大的概念,它允许函数捕获外部变量并在函数外部访问这些变量。闭包在很多场景下都非常有用,比如在匿名函数、Lambda 表达式和委托中。在使用闭包时,我们需要注意变量捕获的副作用、性能影响和内存管理等问题,以确保代码的正确性和性能。
在这里插入图片描述

http://www.yayakq.cn/news/52670/

相关文章:

  • 仿爱奇艺网站源码wordpress 点击图片放大
  • 怎么建立本地网站我是一条龙
  • 建设部网站不支持360网站换域名有没有影响
  • 公司做网站要多少钱万网官网入口
  • 温州seo建站山阴县2017建设局网站
  • 佛山网站建设制作python做网站优势
  • 成都网站建设服务密需湖南岚鸿案例哪个网站虚拟主机好
  • 成都电商网站开发公司门户网站名词解释
  • 查询建设资质的网站wordpress不能写文章
  • 东莞网站优化公司推荐做微信商城网站
  • 淘宝联盟怎么做自已的网站杭州哪个网站建设最好
  • 成都网站建设、html播放视频
  • 建设一个网站的设备响应式网站几个断点
  • 网站怎么做悬浮图片wordpress分类目录 插件
  • 网站seo相关设置优化境外网站在国内做镜像
  • 安徽网站优化价格咨询深圳关键词
  • 建设工程监理 精品课网站网站做好了 怎么做解析
  • 什么是网站托管创建企业需要什么条件
  • 做网站有的浏览器室内设计联盟官方app
  • 投资网站网站源码服务器两个域名一个ip做两个网站吗
  • 厦门建设局网站2018wordpress建站好用吗
  • 自己学做网站看什么书个人网站界面设计图片
  • 泰安网络网站网页设计软件哪个好
  • 做网站公众号多少钱罗湖网站设计公司哪家好
  • wordpress做x站主题青海省住建局和建设厅门户网站
  • 万网 网站建设方案书好的国内网站建设公司
  • 惠州seo排名外包前端页面优化
  • 网站竞价推广怎么做设计师网页导航官网
  • 大城县建设局网站高端网站建设万维科技
  • 北京网站优化校学费常用的搜索引擎有