游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

。NET7和C11的7大自定义扩展方法

  介绍
  自从我开始了解扩展方法以来,我不断地发现新的可能性,让我的编码生活更轻松。扩展方法是SOLID完美应用中的O开闭原则。一个类应该尽可能简单,并且只在其他组件真正需要时才将属性和方法暴露给外部。
  通过扩展方法,您可以为您的类实现额外的方法,而无需更改类本身!这非常适合将类作为参数的重复方法。
  实现扩展方法非常简单。看看下面的例子:namespaceSystem;publicstaticclassEnumerableExtensions{publicstaticvoidForEachT(thisIEnumerableTsequence,ActionTaction){foreach(variteminsequence)action(item);}}
  这在每个IEnumerable(由this关键字引入)上实现了ForEach()方法,就像您从List类型中了解到的那样。要访问此方法,您唯一需要做的就是添加对相应命名空间的引用,在本例中为System。我最常用的7种扩展方法
  自。NET6以来,Microsoft为IEnumerable实现了一些扩展方法,我之前将这些方法列在了我的首选列表中,包括DistinctBy()和Chunk()。但是,从。NET7开始,我仍然缺少一些非常重要的方法,尤其是处理任务(Task)集合的方法。
  事不宜迟,以下是我在。NET7中最常用的扩展方法:1。TryAsync
  第一种扩展方法是我最喜欢的一种。您有多少次在刚刚创建的方法周围添加trycatch块,并且因为它破坏了外观而变得有点恼火?当您的方法返回Task或Task时,这是一个非常简洁的解决方案:publicstaticasyncTaskResultTryAsync(thisTasktask,ActionExceptionerrorHandlernull){try{awaittask;returnResult。Ok();}catch(Exceptionex){if(errorHandlerisnotnull)errorHandler(ex);returnex;}}publicstaticasyncTaskResultTTryAsyncT(thisTaskTtask,ActionExceptionerrorHandlernull)whereT:class{try{returnawaittask;}catch(Exceptionex){if(errorHandlerisnotnull)errorHandler(ex);returnex;}}
  现在你可以这样写:varresultawaitGetSomethingAsync()。TryAsync();
  您的方法将自动包装在trycatch块中。此外,您可以为其他辅助逻辑(如日志记录)提供errorHandler。然后可以检查这些方法返回的结果是否成功,后续您可以继续您的逻辑。
  2。WhenAllAsync
  集合中有多个Task或Task以正常方式处理有点不方便。您需要调用Task。WhenAll(tasks)这让我有点脱离流程,因为它不是流畅的风格。这是它的样子:publicstaticasyncTaskIEnumerableTWhenAllAsyncT(thisIEnumerableTaskTtasks){if(tasksisnull)thrownewArgumentNullException(nameof(tasks));returnawaitTask。WhenAll(tasks)。ConfigureAwait(false);}publicstaticTaskWhenAllAsync(thisIEnumerableTasktasks){if(tasksisnull)thrownewArgumentNullException(nameof(tasks));returnTask。WhenAll(tasks);}
  现在我可以方便的地处理任何任务集合:varresultsawaittasks。WhenAllAsync();3。WhenAllSequentialAsync
  下一个扩展方法甚至可以为您节省几行代码,并让您能够逐个执行每个任务。这在您可能不会并行执行许多任务的情况下很有用。publicstaticasyncTaskIEnumerableTWhenAllSequentialAsyncT(thisIEnumerableTaskTtasks){if(tasksisnull)thrownewArgumentNullException(nameof(tasks));varresultsnewListT();foreach(vartaskintasks)results。Add(awaittask。ConfigureAwait(false));returnresults;}publicstaticasyncTaskWhenAllSequentialAsync(thisIEnumerableTasktasks){if(tasksisnull)thrownewArgumentNullException(nameof(tasks));foreach(vartaskintasks)awaittask。ConfigureAwait(false);}4。WhenAllParallelAsync
  最后但同样重要的是,可能有一个用例,您可以并行执行任务,但可能有最大数量限制。对于这种情况,我有以下扩展方法:publicstaticasyncTaskIEnumerableTWhenAllParallelAsyncT(thisIEnumerableTaskTtasks,intdegree){if(tasksisnull)thrownewArgumentNullException(nameof(tasks));varresultsnewListT();foreach(varchunkintasks。Chunk(degree)){varchunkResultsawaitTask。WhenAll(chunk)。ConfigureAwait(false);results。AddRange(chunkResults);}returnresults;}publicstaticasyncTaskWhenAllParallelAsync(thisIEnumerableTasktasks,intdegree){if(tasksisnull)thrownewArgumentNullException(nameof(tasks));foreach(varchunkintasks。Chunk(degree))awaitTask。WhenAll(chunk)。ConfigureAwait(false);}
  使用degree参数,您可以指定应并行执行多少个任务。5。MapAsync
  这也是一个流畅的扩展,但这次是针对单个Task或Task。publicstaticasyncTaskTOutMapAsyncTIn,TOut(thisTaskTIntask,FuncTIn,TaskTOutmapAsync){if(taskisnull)thrownewArgumentNullException(nameof(task));if(mapAsyncisnull)thrownewArgumentNullException(nameof(mapAsync));returnawaitmapAsync(awaittask);}publicstaticasyncTaskTOutMapAsyncTIn,TOut(thisTaskTIntask,FuncTIn,TOutmap){if(taskisnull)thrownewArgumentNullException(nameof(task));if(mapisnull)thrownewArgumentNullException(nameof(map));returnmap(awaittask);}
  使用此扩展方法,您可以将Task流畅地映射到Task,类似于Enumerable。Select()方法。6。DoAsync
  类似的方法是DoAsync(),但不是转换任务,而是可以使用任务结果执行辅助逻辑而不改变其返回值。publicstaticasyncTaskTDoAsyncT(thisTaskTtask,FuncT,TasktapAsync){if(taskisnull)thrownewArgumentNullException(nameof(task));if(tapAsyncisnull)thrownewArgumentNullException(nameof(tapAsync));varresawaittask;awaittapAsync(res);returnres;}publicstaticasyncTaskTDoAsyncT(thisTaskTtask,ActionTtap){if(taskisnull)thrownewArgumentNullException(nameof(task));if(tapisnull)thrownewArgumentNullException(nameof(tap));varresawaittask;tap(res);returnres;}7。String。Join
  最后一个是我有时用于连接字符串以进行日志记录的扩展方法。通常,您可以为此使用string。Join(),但同样,这并不流畅,让我无法理解。publicstaticstringJoin(thisIEnumerablestringsequence,stringseparator){returnstring。Join(separator,sequence);}缩略
  技术上不是扩展方法,但对节省一些代码也很有用,以下是我的缩写方法:namespaceSystem;publicstaticclassAbbreviations{publicstaticIEnumerableTArrT(paramsT〔〕elements)elements;publicstaticvoidTry(Actionaction,ActionException?errorHandlernull){try{action();}catch(Exceptionex){if(errorHandlerisnotnull)errorHandler(ex);}}publicstaticResultTTryT(FuncTaction,ActionException?errorHandlernull)whereT:class{try{returnaction();}catch(Exceptionex){if(errorHandlerisnotnull)errorHandler(ex);returnex;}}}
  要轻松使用它们,您必须在根级别创建一个特殊文件(我通常将其称为GlobalUsings。cs)并在其中放入以下行:globalusingstaticSystem。Abbreviations;1。Arr
  Arr方法是从现有值创建新IEnumerable的缩写。通常,这将需要非常丑陋的代码,如下所示:vararrnew〔〕{param1,param2,。。。};
  现在你可以这样写:vararrArr(param1,param2,。。。);
  哪个看起来更漂亮?2。Try
  您有多少次只是想在一个新方法周围添加一个简单的trycatch块,但由于它在您的代码中占用了太多空间,所以感觉很难看?这是一个缩写方法Try()的解决方案。
  在最短的形式中,你可以写:Try(TestMethod);
  其中TestMethod是一个不带任何参数的方法。这使您能够编写极短的代码并消除那些讨厌的trycatch块。
  对于异步方法,我建议您使用上面的扩展方法TryAsync,因为它是流畅的风格。
  当然,还有更多的可能性,您可以使用此架构并制作自己的缩写词和扩展方法。在评论中让我知道你的想法。
  我希望您发现其中一些方法有用并将它们应用到您的项目中。
  谢谢阅读!

惊天4换1,杜兰特联手塔图姆?美媒喊话绿军出手!打包两人换来北京时间4月30日,哈登已经带着他的球队昂首晋级东部半决赛了,杜兰特则是和篮网早早04回家钓鱼。而现在美国媒体也是列出了一个,能让走入绝境的篮网队能够重新崛起的交易方案,……砂石易矿权国企控股21亿元拿下安徽大矿,砂石储量6。5亿吨近日,池州市自然资源和规划局在池州市公共资源交易管理中心对安徽省东至县柯家村熔剂用白云岩熔剂用石灰岩矿采矿权公开挂牌出让。现安徽交控东流新材料有限公司以成交价212000万元成……活虾怎么保存更新鲜?水产店老板教了一招,学会了天天能吃新鲜虾为了买到活跳跳鲜虾,家庭主妇需要大清早起床上菜市场采买,不过虾子生性敏感,运送过程很容易一不小心就出现了损伤,进而导致细菌滋生。另一方面主妇们也会担心,眼前看似新鲜的虾子,会不……体坛叛徒胡娜,赴美比赛一去不归,32年后高调回国捞金,拒不道一失足成千古恨,再回首已百年身,人生中任何一次重大的失误,都可能酿成无法挽回的遗憾。即使你重新来过,它也已经残破不堪,无法恢复往日的辉煌。荣誉是每个人前进的动力,碛里征人……双生天使登场中辅双摇莫甘娜完整教学近期联盟手游登陆了两个新游戏,分别是天使和莫甘娜两姐妹。莫甘娜的操作能力并没有天使那么高,且莫甘娜的实用性比较强,在实战中可以适用于很多位置,中单、打野、辅助都是不错的选择。今……农村常见的鼠曲草有什么作用?一,鼠曲草也叫清明菜鼠曲草在以前的《中国植物志》中记载为鼠麴(qu)草,之后修订后正式中名就叫鼠曲草,属于菊科鼠曲草属一年生草本植物。其别名多地叫清明菜,因为在清明前后它……2022金球奖完整的提名名单,有四名法国人,没有梅西前提与去年相比,有18位新面孔但上一届获胜者莱昂内尔梅西缺席。这或许是绝代双骄时代后的第一届金球奖。当金球奖决定改变时,他的改变几乎是颠覆性的。从这第六十六届金球奖……南宁的三品王和老友粉,哪个能代表南宁第一位置的米粉?这个问题可以分几下几点来讨论一:老友粉的起源,可追溯到1926年北伐战争时期,创始人黄前辈曾是李宗仁麾下炊事班中一员,随同李宗仁部队一起出征北伐。出征前,他们有考虑到这一……老铁们,你们觉得浓香型白酒未来发展会是什么走势?平心而论,浓香型白酒绝对是最好喝的,几次盲品的全国品酒大会结果就证明了这一点。1979年,第三届全国评酒会开始依据酒的风(香)格(型)来评选国家名酒,浓清酱米四香并立,浓……东契奇,历史级Bug的存在东契奇职业生涯至今取得的成绩:2017年欧锦赛冠军2018年欧冠冠军、MVP及四强MVP2018年西甲冠军、MVP201819赛季NBA最佳新秀2……剑侠世界3全网寻找长歌锦鲤弟子!豪礼大奖只等领取西山居《剑侠世界3》此次的公测,真是堪称武侠手游戏圈的一场江湖盛宴,也是让无数武侠迷们再次集结,重聚于此!专属公测服务器剑啸长歌一开服更是有不少的玩家涌来。西山居为此次《剑侠世……最美二传魏秋月与老公袁灵犀15岁相识,从众多情敌中携手2022年,中国体育博物馆举行辉煌逐梦文化展,其中有一枚2016年奥运会女排金牌,显得格外引人注意。作为见证了女排从低谷走向巅峰的一枚金牌,它的存在总是让人感慨万千。……
肖战将出演庆余年中的言冰云古装剧《庆余年》脑洞大开的情节在网上掀起了逐剧的热潮。该剧邀请到广受欢迎的男神肖战特别演出。在一个场景中,张若昀帮他上药,让网友们脑补男主男配CP。张若昀还透露肯定会有第二季,……6个流传很广的假养生之道,你以为是在养生,其实会有害健康现在,随着我们日常生活水平的不断提高,也出现了越来越多的人把目光关注到自己的身体健康上。没有一个好的身体,再多的钱也没有意义。现在,日常养生早已逐渐成为一种趋势,越来越多的人也……怀斯曼勇士如果让我上场36分钟,我能砍下2010的数据帮助库在之前怀斯曼因为脚踝的伤势连续缺席了11场比赛,当时库里也因为受伤没有参加比赛,人们都在讨论怀斯曼是不是运气太差了,原本库里休战之后是他证明自己的机会,但是没想到他却在这个关键……聚焦双十一刷单与信息贩卖,电商深陷灰色产业链?双十一消费者热情依旧,但购物热情的背后却暗流涌动起来。从5月份中国青年报所报道的《利用个人信息刷单,快递空包裹里的黑色利益》,再到双十一期间人民日报发文《刷好评已经成灰色……全明星次轮投票结果库里领跑,哈登被反超,2大新人逆袭NBA官方公布了全明星第二轮球迷投票的结果,其中库里仍然领跑票王,杜兰特则是东部票数第一,只不过他们的优势并不大,身后的詹姆斯和字母哥仍有机会反超,这次的投票还是非常激烈的。……别有一番韵味的民国美女老照片,原来还有这样一种美这是1938年从香港抵达悉尼的民国女性。在船上的合影。参加活动的民国旗袍女子合照,旗袍确实最能彰显东方女性之美。这是民国时一群年轻女子到照相馆留下的一张合影照,那年……癫痫患者长期吃抗癫痫药物,要不要补钙?长期服用抗癫痫药物的患者,在药物治疗的过程中往往会出现这样那样的问题,而在这些问题之中,很多都与钙剂摄入不足有关。如果在平时生活中,没有及时地补钙,那么就很容易导致身体内……微软等巨头争相布局的工业元宇宙究竟是什么,为何它值得被追捧?众所周知,工业是国民经济的主体。近五年来,作为我国工业发展关键支撑的工业互联网已经取得了显著的成绩。因此,工业的发展必须适应新时代的发展,我国工业互联网必须进一步走上新的……影响地物光谱反射率变化的因素有哪些?莱森光学有很多因素会引起反射率的变化,如:太阳位置、传感器位置、地理位置、地形、季节、气候变化、地面湿度变化、地物本身的变异、大气状况等。太阳位置主要是指太阳高度角和方位角,如果……马化腾放狠话,任宇昕很尴尬2022生机大会在信息流和短视频的竞争中,没能为腾讯挣到一张船票的PCG面临着尴尬。腾讯转而希望将短视频和电商相结合,贴近交易,视频号冲锋在前,尝试做电商闭环。作者……拥有驾照的小伙伴,这些道路标志你一定要知道直走(gostraight)直行标志一般位于地面上,或者红绿灯,以立牌显示,与单行线标志(方形)不同的是,它是圆框的。Straightlinesignsaregen……煮小米粥有诀窍,不可只用清水,多做2步,米粥鲜香浓稠,米油厚煮小米粥有诀窍,不可只用清水,多做2步,米粥鲜香浓稠,米油厚小米粥,是非常适合秋冬季节的美食,因为现在天气冷了,气候也变得干燥,多吃小米,多吃粗粮对肠胃好,滋补效果也非常……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网