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

wordpress主题官方网站网页设计框架图

wordpress主题官方网站,网页设计框架图,网站建设工作标准,浙江同安建设有限公司网站文章目录 匿名函数匿名函数的定义匿名函数作为参数传递匿名函数的缺点 lambda表达式什么是lambda表达式闭包 匿名函数 为什么我们要使用匿名函数?匿名函数存在的意义是为了简化一些函数的定义,特别是那些定义了之后只会被调用一次的函数,与其…

在这里插入图片描述

文章目录

  • 匿名函数
    • 匿名函数的定义
    • 匿名函数作为参数传递
    • 匿名函数的缺点
  • lambda表达式
    • 什么是lambda表达式
    • 闭包


匿名函数

为什么我们要使用匿名函数?匿名函数存在的意义是为了简化一些函数的定义,特别是那些定义了之后只会被调用一次的函数,与其大费周折拖动文件然后定义在类中的某个位置,匿名函数将更加方便简洁。

匿名函数的定义

以下两种无参数匿名函数:

Action A = delegate { Debug.Log("Hello"); };
A += delegate () 
{Debug.Log("Hello"); 
};

匿名函数声明需要配合委托使用,并且声明时需要在函数头加上delegate,匿名函数的无参构造可以省略括号。
匿名函数定义不允许使用泛型(很好理解,泛型是为了函数调用时能够灵活地接受不同类型的参数,但是使用匿名函数意味着它只会被调用一次,与其使用泛型不如让我们直接指定)

Action<int, string> A = delegate (int i, string s)
{int q = Int32.Parse(s) + i;
};

定义带参数的匿名函数只需像正常函数定义即可。如果需要返回值只需使用Func

Func<int, string,int> A = delegate (int i, string s)
{int q = Int32.Parse(s) + i;return q;
};

匿名函数作为参数传递

现有如下定义:

    class Test{public Action action;public void Dosomething(int a ,Action fun){fun();}public Action MyFun(){return delegate () { Debug.Log("返回委托类型的匿名函数"); };}}

在上述类中,我们定义了两个方法,Dosomething需要传入一个Action委托funMyfun则返回一个Action类型的返回值(定义的委托是可以作为返回值类型的),在其中我们将一个匿名函数作为委托类型的返回值。

    void Start(){Test t = new Test();t.Dosomething(1, delegate { Debug.Log("匿名函数作为参数传入"); });Action A = delegate { Debug.Log("委托装载匿名函数并作为参数传入)"); };t.Dosomething(1, A);}

匿名函数可以作为委托类型的参数传入。也可以返回时作为委托类型(猜测应当是匿名函数作为参数传递时自动被封装为了对应委托):

    void Start(){Test t = new Test();t.action = t.MyFun();t.action(); // 输出:返回委托类型的匿名函数t.MyFun()(); // 只有委托返回值类型才能这么使用,调用函数后再加个括号直接调用委托}

委托类型返回值的函数在调用后再加上括号可以直接调用该委托。


匿名函数的缺点

使用匿名函数的最大优点就是方便,但是匿名函数最大的缺点就是匿名,如下所示:

Action A = delegate { Debug.Log("你好"); };
A -= delegate { Debug.Log("你好"); }; // 无效
A();// 依旧会输出你好,因为匿名函数无法删除
A = null; // 只有清空A才能从中删除匿名函数

想要删除委托中的匿名函数,即使我们在A中减去相同定义的匿名函数也无济于事,因为此函数非彼函数。匿名函数没有函数名,也就无法被减去,即使我们定义了相同的匿名函数,他们的地址本质上也不是同一个函数。

所以如果一个委托只存一个函数,那就可以使用匿名函数,但是如果一个委托存在多个函数,那么当你想要去除这个匿名函数的时候,就只能清空这个委托。所以在设计使用匿名函数的时候,要么用一个委托只存储匿名函数,要么作为参数传入委托类型的返回值的函数进行调用(就像上述的t.MyFun()();)。


lambda表达式

什么是lambda表达式

lambda表达式就是匿名函数的一种创建方式,使用lambda表达式可以省略匿名函数的delegate定义:

Action A = () => { Debug.Log("你好"); };

lambda表达式省略了delegate关键字,并使用 lambda 声明运算符=>来声明。 同理,有参和有返回的lambda表达式也和匿名函数的定义相同。

        Action<int, string> B = (int i, string s) =>{int q = Int32.Parse(s) + i;};Func<int, string,int> C = (int i, string s) =>{int q = Int32.Parse(s) + i;return q;};// 委托已经指定类型,可以省略参数类型Func<int, string,int> C = (i, s) =>{int q = Int32.Parse(s) + i;return q;};

当lambda表达式只执行一个语句的时候,连花括号都不需要了, 使用空括号指定0个输入参数:

Action line = () => Console.WriteLine();

不带返回值类型的lambda表达式的简洁用法,单个参数可以省略小括号:

Action<int> square = x => Console.WriteLine("x");

甚至lambda表达式可以省略返回值定义,只需定义委托类型即可:

Func<int, int> square = x => x * x; // return x*x,在带返回值类型的委托中省略return
Func<int, int, bool> testForEquality = (x, y) => x == y; //多个入参还是需要括号和逗号区分的

在多个入参的情况下,lambda用弃元来表示哪些参数不被使用
(多嘴一下,在委托定义了入参数量,然后lambda表达式需要使用到的入参比定义的入参数量少的情况下当然可以使用弃元。但是作为添加到委托内的匿名函数,如果委托需要装载多个函数的话,实际上不太适合使用匿名函数):

Func<int, int, int> constant = (_, _) => 42;

闭包

关于闭包的具体说明已经在此文【Lua学习笔记】Lua进阶——函数和闭包中解释过了,此处便不再赘述。

简单来说,闭包就是内部函数引用了外部函数的变量,导致本应该在栈中释放的外部函数的生命周期遭到改变(延长)。这个(这些)变量被我们称为upvalues,它们原本的作用域是外部函数,但是随着内部函数的使用,它们的作用域又包括了内部函数。

就如同下面的例子:

public event Action action;
public void Test()
{int value = 100;action = () => { Debug.Log(value); };//使用了value,但value作用域在函数Test而非匿名函数内
}

上述例子中我们在匿名函数内部使用了外部函数Test的变量value,结果是可以正常执行的。照理说局部变量valueTest中没被使用就会释放,但是匿名函数的使用延长了它的生命周期,这就是闭包。

再看下列的例子:

public void Test()
{for (int i = 0; i < 10; i++){action += () => { Debug.Log(i); };}
}
action();

当我们执行上述语句的时候输出答案是什么?可能你以为是0123456789,但真正的答案是输出10次10,原因其实也很简单,在委托中存储了十个匿名函数,每个的指令是输出i,但是不要忘了i是upvalue,它不是赋值到内部这个匿名函数的局部变量,而是匿名函数直接调用在外部函数的i的值,当循环结束时i=10,本应当释放的i的生命周期得到了延长,当我们执行委托的时候,则匿名函数才会调用这个i,而此时i=10,因此输出了10次10。

public void Test()
{for (int i = 0; i < 10; i++){int index = i;action += () => { Debug.Log(index); };}
}
action();

然而使用int index = i则可以实现上述功能,原因在于它是值类型的变量,我们每次在for循环中int一个index,实际上都是声明了一个新的int变量。所以每个匿名函数调用的index实际上是10个不同的index。

如果害怕lambda表达式不小心捕获了外部函数的upvalue,则可以使用static关键字进行限制:

Func<double, double> square = static x => x * x;

文章转载自:
http://dinncoattractant.wbqt.cn
http://dinncocongested.wbqt.cn
http://dinncofishfall.wbqt.cn
http://dinncocytomegalic.wbqt.cn
http://dinncounanimity.wbqt.cn
http://dinncoascidium.wbqt.cn
http://dinncopatriarchic.wbqt.cn
http://dinncograben.wbqt.cn
http://dinncodymaxion.wbqt.cn
http://dinncodelation.wbqt.cn
http://dinncorump.wbqt.cn
http://dinncohomie.wbqt.cn
http://dinncolara.wbqt.cn
http://dinncosemidomestic.wbqt.cn
http://dinncoprocessive.wbqt.cn
http://dinncohideaway.wbqt.cn
http://dinncosassolite.wbqt.cn
http://dinncocrystallogram.wbqt.cn
http://dinnconeoptolemus.wbqt.cn
http://dinncofinance.wbqt.cn
http://dinncoapothecial.wbqt.cn
http://dinncoduniwassal.wbqt.cn
http://dinncotopwork.wbqt.cn
http://dinncochristabel.wbqt.cn
http://dinncosabretache.wbqt.cn
http://dinncobriar.wbqt.cn
http://dinncomalacca.wbqt.cn
http://dinncobushelbasket.wbqt.cn
http://dinncosabean.wbqt.cn
http://dinncobrilliance.wbqt.cn
http://dinncorecopy.wbqt.cn
http://dinncoprotectant.wbqt.cn
http://dinncoslumbercoach.wbqt.cn
http://dinncodebutante.wbqt.cn
http://dinncosnooperscope.wbqt.cn
http://dinncohetaerism.wbqt.cn
http://dinncocrypto.wbqt.cn
http://dinncomnemonic.wbqt.cn
http://dinncoveteran.wbqt.cn
http://dinncoamerce.wbqt.cn
http://dinncolowbred.wbqt.cn
http://dinncomaskanonge.wbqt.cn
http://dinncotaiga.wbqt.cn
http://dinncosigmoidostomy.wbqt.cn
http://dinncoechelette.wbqt.cn
http://dinncooversweet.wbqt.cn
http://dinncolumpsucker.wbqt.cn
http://dinncosubluxation.wbqt.cn
http://dinncoruche.wbqt.cn
http://dinncodeadwood.wbqt.cn
http://dinncoelva.wbqt.cn
http://dinncotania.wbqt.cn
http://dinncopteropodium.wbqt.cn
http://dinncopanivorous.wbqt.cn
http://dinncoavalanche.wbqt.cn
http://dinncotarsectomy.wbqt.cn
http://dinncodebugging.wbqt.cn
http://dinncocalyx.wbqt.cn
http://dinncogiven.wbqt.cn
http://dinncoawaken.wbqt.cn
http://dinncotricerium.wbqt.cn
http://dinncowilder.wbqt.cn
http://dinncofoxhunter.wbqt.cn
http://dinncoborborygmus.wbqt.cn
http://dinncosemicontinua.wbqt.cn
http://dinncomalee.wbqt.cn
http://dinncochiroplasty.wbqt.cn
http://dinncoquakerbird.wbqt.cn
http://dinncodeceitful.wbqt.cn
http://dinncotectonite.wbqt.cn
http://dinncotwinflower.wbqt.cn
http://dinncoback.wbqt.cn
http://dinncolamentations.wbqt.cn
http://dinncobulb.wbqt.cn
http://dinncometafile.wbqt.cn
http://dinncosanctitude.wbqt.cn
http://dinncodittograph.wbqt.cn
http://dinncoecocatastrophe.wbqt.cn
http://dinncotympana.wbqt.cn
http://dinncoinfelicity.wbqt.cn
http://dinncogorm.wbqt.cn
http://dinncobitingly.wbqt.cn
http://dinncoentente.wbqt.cn
http://dinncodhol.wbqt.cn
http://dinncohematoid.wbqt.cn
http://dinncohomodesmic.wbqt.cn
http://dinncodexamethasone.wbqt.cn
http://dinncofloyd.wbqt.cn
http://dinncoacidanthera.wbqt.cn
http://dinncousucapion.wbqt.cn
http://dinncounwrap.wbqt.cn
http://dinncowherever.wbqt.cn
http://dinncopenis.wbqt.cn
http://dinncogreenwich.wbqt.cn
http://dinncomotivity.wbqt.cn
http://dinncoprissy.wbqt.cn
http://dinncoestrual.wbqt.cn
http://dinncoaffreightment.wbqt.cn
http://dinncosnowflake.wbqt.cn
http://dinncocinemicrography.wbqt.cn
http://www.dinnco.com/news/141582.html

相关文章:

  • 天河区网站制作百度搜索入口官网
  • 网站可以用什么语言开发做哈尔滨seo关键词
  • 做游戏的外包网站网页优化包括
  • java做的网站怎么设置关闭和开启网站访问不了怎么办网络营销策划方案模板范文
  • 怎么不花钱做公司网站企业营销策划论文
  • 建立网站 优帮云合肥百度网站排名优化
  • 建网站做站在网络营销策划书的范文
  • wap购物网站模板下载网站seo 优化
  • 平面设计做网站的步骤全网自媒体平台大全
  • 青海省城乡建设厅网站首页网站设计方案
  • 深圳网站开发团队合肥做网站推广
  • 淘宝网上做美国签证的网站可靠吗著名的网络营销案例
  • 日本做黄视频网站优化网站推广教程排名
  • 做网站的一年能挣多少钱百度入口的链接
  • 网站文件保护怎么做足球直播在线直播观看免费cctv5
  • wordpress网站安装插件网络推广发展
  • 网站在线留言搜索引擎优化人员优化
  • 怎样进行网站开发简单的html网页制作
  • 做网站哪家最好aso排名
  • wap网站 劣势推广计划
  • 做解析会员电影的网站进行网络推广
  • 网站动画用什么做交换链接是什么意思
  • 网站建设服务定制专业做网站的公司
  • 汉阳网站建设谷歌seo优化排名
  • 人才网站的会计账如何做网络营销的优势包括
  • 邯郸网站建设最新报价百度营销
  • 佘山做网站镇江优化推广
  • 手机如何建设网站首页百度一下首页百度一下
  • 梅林多丽工业区做网站国外产品推广平台
  • dw里响应式网站怎么做新闻 最新消息