专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

。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,因为它是流畅的风格。
  当然,还有更多的可能性,您可以使用此架构并制作自己的缩写词和扩展方法。在评论中让我知道你的想法。
  我希望您发现其中一些方法有用并将它们应用到您的项目中。
  谢谢阅读!

花钱养水军,用台湾问题碰瓷?可以休矣来源华广网一段时间以来,民进党当局借俄乌冲突炒作所谓大陆威胁,试图进一步破坏两岸关系。以美国为首的西方反华势力同样采取卑劣手段,在国际场合意图通过俄乌冲突来碰瓷台湾问题,恶意挑拨中糖尿病患者,如何预防肾损害?做到3个限制,才能保护好你的肾案例分享65岁的王女士,以确诊糖尿病6年余,小便异常10天为主诉入院。6年余前在单位体检时发现空腹血糖偏高,经过详细的检查后确诊为2型糖尿病。此后开始口服降糖药进行治疗,但是王女士又一国产神药涨价?国内卖326元,出口13元,为啥差别这么大国内的中药市场诞生出过许多明星产品,比如片仔癀六味地黄丸速效救心丸等,其中,片仔癀一粒(3克)的售价可以高达590元,平均每克197元,这是什么概念呢,目前黄金每克382元,2克片同样是豪门儿媳,把郭晶晶奚梦瑶放在一起看,差别就出来了中国豪门多,香港算大哥。提起香港第一个想起的,绝对是香港拥有浓厚历史的豪门世家。虽然以首富李嘉诚为首,郭得胜李兆基郑裕彤在内的四大家族名声在外。但排资论辈,金字塔顶端的却不是他们。陈某志的光荣史6。10唐山烧烤摊打人事件的主要犯罪嫌疑人陈继志,是个奇葩人物。随着他身上的许多往事慢慢被扒出来,惊掉大家眼球。谁敢惹我陈某人?一2015年12月,暴力殴打商某凯,致使受害人额骨凹关于003航母全电推进的一点知识整理在进行全电推进的讲解之前首先要明确这个全电推进是个啥玩意,这与是核动力还是传统动力完全是两码事,很多人在这块容易搞混,这么说吧,目前舰用动力分为全燃动力,象美国海军的驱逐舰以及巡洋6。19历史上的今天2015年6月19日,乔石遗体火化,天安门国旗降半旗。新华社电中国共产党的优秀党员,久经考验的忠诚的共产主义战士,杰出的无产阶级革命家政治家,党和国家的卓越领导人,中国共产党第十三感动!这些关于父亲的点滴回忆,直戳心底在您陪我长大我陪您变老变与不变中定格父爱我有超级老爸说起爸爸你脑海中印象最深的是什么?是小时候把你架在肩膀上的伟岸身躯是长大些教你人生哲理时的严厉面孔是去送你外出求学时那双强忍泪水我的第一次北漂每一个北漂,都有自己的故事,就像世上没有一片相同的树叶。不同时期的北漂,又各有不同的印迹,就像树的年轮,每一圈都有不同的经历。我的第一次北漂,始于1999年6月10日。这一天,我在致敬!我的爸呀!!(什么都不说)听说每个人小时候只有在一种情况下才找爸把你爸叫来我们的爸爸都有一个共同点就是爱说谎小时候他说眼睛看前面,我扶着车呢红包爸爸帮你收着,以后全是你的打针一点儿也不疼长大后他说工作太忙,话匣君说财经美联储加息,日本遭殃视频加载中本周美联储宣布加息75个基点,为1994年以来的最大单次加息。这种加息幅度,主要都发生在1980年代初美联储与通货膨胀作斗争时期。美联储这次大幅加息,就是为了凸显其抗击通
中国男足没去世界杯,中国裁判要去世界杯!另外还有三名女性主裁国际足联19日公布了卡塔尔世界杯的裁判名单。来自中国足协的主裁判马宁边裁曹奕施翔入选了这份名单。此前,陆俊穆宇欣也曾经入选过世界杯裁判团队名单。在2002年的韩日世界杯上,陆俊执法领先荷兰,中国率先破冰光芯片,外媒ASML该醒醒了毫无疑问,芯片现在已经成为我们日常生活和工作不可或缺的需求,你可能看不到它,但是它提供的服务几乎无处不在。大家知道芯片,但想必很多人并不了解芯片,如果准确的说,我们现在的芯片叫作电喝白开水与长期喝茶的人相比,谁的身体更健康?看完终于明白了水在人体的新陈代谢过程当中起到了不可或缺的作用,所有的代谢都离不开水分的参与,为了能够确保身体的健康,每天都需要饮用足够量的水才可以。但随着生活条件的不断改善,一些人开始使用茶水来大象的饮食喜好,被我拿捏了吃吃吃就知道吃吃吃吃根本停不下来大象的日常生活基本只被一件事占据就是吃玉米菠萝竹笋芭蕉猜猜什么美食最能俘获大象的心?大象是纯粹的植食性动物,每头大象一天所需的食物重达上百公斤,相当广州单日新增过千管控区有人挪开水马外出致邻近区域感染11月6日,广州市疫情防控新闻发布会(2022年总第113场)举行。广州市卫生健康委副主任新闻发言人张屹在会上通报,11月5日0至24时,广州市新增1325例新冠病毒本土感染者,9应酬时别忘在酒杯旁准备瓶白开水,用处可大了,职场老油条的法宝应酬时别忘在酒杯旁准备一瓶白水,用处可大了,职场老油条的法宝很多人都把一个人进入社会和在学校进修的这两个阶段分开了看,并且认为这两者之间是有一道分水岭的。这其实是只看见了事物的最表白开水配一物,清理血管,快速降血脂你知道吗?经常在白开水里配一物,也能帮你清理血管,快速降血脂。主要用的就是一味药材,那就是决明子。决明子药性偏苦寒,它本身就是一种清热药,有很强的润肠通便作用,经常上火导致的便秘,大便干硬都炒作熄火!片仔癀回归理性作者丨朱艺艺编辑丨朱益民图源丨图虫千亿市值的中药龙头片仔癀(600436。SH),需要重拾投资者信心。今年前三季度,片仔癀实现营收66。16亿元,同比增长8。25归母净利润20。5各地对特困人员参加居民医保的个人缴费部分给予全额资助央视网消息医疗保障是减轻人民负担增进民生福祉的重大制度安排,是普惠性质的重大民生工程。眼下,全国各地正在开展2023年度城乡居民医疗保险缴费。根据国家规定,城乡居民基本医疗保险实行和耐克阿迪掰手腕,安踏李宁能赢吗?国潮汹涌运动国货能否迈进千亿时代?双十一混战已经打响,运动鞋服已经成为每年最重要的战场之一。近日,各大电商平台纷纷发布预售战绩,耐克安踏李宁阿迪达斯等运动鞋服品牌交战激烈。上榜的前赶在双11上市的新品手表华为GTCyber大开脑洞,绿厂性价比无敌每年的双十一都热闹非凡,不仅有各个厂商开启低价吸引消费者前来购买,同时还有一些新品也喜欢挑在双11这种自带人气BUFF加持的期间段发布,像是华为和OPPO。前者为我们带来了华为Wa
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网