微软正式发布C10,支持。NET6和VisualStudio
IT之家2月12日消息,据微软中国MSDN,宣布C10作为。NET6和VisualStudio2022的一部分已经发布了。在这篇文章中,微软将介绍C10的许多新功能,这些功能使你的代码更漂亮、更具表现力、更快。
阅读VisualStudio2022公告和。NET6公告以了解更多信息,包括如何安装。
VisualStudio2022公告
https:aka。msvs2022gablog
。NET6
https:aka。msdotnet6GA全局和隐式usings
using指令简化了你使用命名空间的方式。C10包括一个新的全局using指令和隐式usings,以减少你需要在每个文件顶部指定的usings数量。
全局using指令
如果关键字global出现在using指令之前,则using适用于整个项目:globalusingSystem;
你可以在全局using指令中使用using的任何功能。例如,添加静态导入类型并使该类型的成员和嵌套类型在整个项目中可用。如果你在using指令中使用别名,该别名也会影响你的整个项目:globalusingstaticSystem。Console;globalusingEnvSystem。Environment;
你可以将全局使用放在任何。cs文件中,包括Program。cs或专门命名的文件,如globalusings。cs。全局usings的范围是当前编译,一般对应当前项目。
有关详细信息,请参阅全局using指令。
全局using指令
https:docs。microsoft。comdotnetcsharplanguagereferencekeywordsusingdirectiveglobalmodifier
隐式usings
隐式usings功能会自动为你正在构建的项目类型添加通用的全局using指令。要启用隐式usings,请在。csproj文件中设置ImplicitUsings属性:lt;PropertyGroupgt;lt;!OtherpropertieslikeOutputTypeandTargetFrameworkgt;lt;ImplicitUsingsgt;enablelt;ImplicitUsingsgt;lt;PropertyGroupgt;
在新的。NET6模板中启用了隐式usings。在此博客文章中阅读有关。NET6模板更改的更多信息。
一些特定全局using指令集取决于你正在构建的应用程序的类型。例如,控制台应用程序或类库的隐式usings不同于ASP。NET应用程序的隐式usings。
有关详细信息,请参阅此隐式usings文章。
博客文章
https:devblogs。microsoft。comdotnetannouncingnet6preview7netsdkcprojecttemplatesmodernized
隐式usings
https:docs。microsoft。comenusdotnetcoreprojectsdkoverviewimplicitusingdirectivesCombiningusing功能
文件顶部的传统using指令、全局using指令和隐式using可以很好地协同工作。隐式using允许你在项目文件中包含适合你正在构建的项目类型的。NET命名空间。全局using指令允许你包含其他命名空间,以使它们在整个项目中可用。代码文件顶部的using指令允许你包含项目中仅少数文件使用的命名空间。
无论它们是如何定义的,额外的using指令都会增加名称解析中出现歧义的可能性。如果遇到这种情况,请考虑添加别名或减少要导入的命名空间的数量。例如,你可以将全局using指令替换为文件子集顶部的显式using指令。
如果你需要删除通过隐式usings包含的命名空间,你可以在项目文件中指定它们:lt;ItemGroupgt;lt;UsingRemoveSystem。Threading。Tasksgt;lt;ItemGroupgt;
你还可以添加命名空间,就像它们是全局using指令一样,你可以将Using项添加到项目文件中,例如:lt;ItemGroupgt;lt;UsingIncludeSystem。IO。Pipesgt;lt;ItemGroupgt;文件范围的命名空间
许多文件包含单个命名空间的代码。从C10开始,你可以将命名空间作为语句包含在内,后跟分号且不带花括号:namespaceMyCompany。MyNamespace;classMyClassNote:noindentation{。。。}
他简化了代码并删除了嵌套级别。只允许一个文件范围的命名空间声明,并且它必须在声明任何类型之前出现。
有关文件范围命名空间的更多信息,请参阅命名空间关键字文章。
命名空间关键字文章https:docs。microsoft。comdotnetcsharplanguagereferencekeywordsnamespace对lambda表达式和方法组的改进
微软对lambda的语法和类型进行了多项改进。微软预计这些将广泛有用,并且驱动方案之一是使ASP。NETMinimalAPI更加简单。
lambda的语法
https:docs。microsoft。comdotnetcsharpwhatsnewcsharp10lambdaexpressionimprovements
ASP。NETMinimalAPI
https:devblogs。microsoft。comdotnetannouncingaspnetcoreinnet6
lambda的自然类型
Lambda表达式现在有时具有自然类型。这意味着编译器通常可以推断出lambda表达式的类型。
到目前为止,必须将lambda表达式转换为委托或表达式类型。在大多数情况下,你会在BCL中使用重载的Funclt;。。。gt;或Actionlt;。。。gt;委托类型之一:Funclt;string,intgt;parse(strings)gt;int。Parse(s);
但是,从C10开始,如果lambda没有这样的目标类型,微软将尝试为你计算一个:varparse(strings)gt;int。Parse(s);
你可以在你最喜欢的编辑器中将鼠标悬停在varparse上,然后查看类型仍然是Funclt;string,intgt;。一般来说,编译器将使用可用的Func或Action委托(如果存在合适的委托)。否则,它将合成一个委托类型(例如,当你有ref参数或有大量参数时)。
并非所有lambda表达式都有自然类型有些只是没有足够的类型信息。例如,放弃参数类型将使编译器无法决定使用哪种委托类型:varparsesgt;int。Parse(s);ERROR:Notenoughtypeinfointhelambda
lambda的自然类型意味着它们可以分配给较弱的类型,例如object或Delegate:objectparse(strings)gt;int。Parse(s);Funclt;string,intgt;Delegateparse(strings)gt;int。Parse(s);Funclt;string,intgt;
当涉及到表达式树时,微软结合了目标和自然类型。如果目标类型是LambdaExpression或非泛型Expression(所有表达式树的基类型)并且lambda具有自然委托类型D,微软将改为生成Expressionlt;Dgt;:LambdaExpressionparseExpr(strings)gt;int。Parse(s);Expressionlt;Funclt;string,intgt;gt;ExpressionparseExpr(strings)gt;int。Parse(s);Expressionlt;Funclt;string,intgt;gt;
方法组的自然类型
方法组(即没有参数列表的方法名称)现在有时也具有自然类型。你始终能够将方法组转换为兼容的委托类型:Funclt;intgt;readConsole。Read;Actionlt;stringgt;writeConsole。Write;
现在,如果方法组只有一个重载,它将具有自然类型:varreadConsole。Read;Justoneoverload;Funclt;intgt;inferredvarwriteConsole。Write;ERROR:Multipleoverloads,cantchoose
lambda的返回类型
在前面的示例中,lambda表达式的返回类型是显而易见的,并被推断出来的。情况并非总是如此:varchoose(boolb)gt;b?1:two;ERROR:Cantinferreturntype
在C10中,你可以在lambda表达式上指定显式返回类型,就像在方法或本地函数上一样。返回类型在参数之前。当你指定一个显式的返回类型时,参数必须用括号括起来,这样编译器或其他开发人员不会太混淆:varchooseobject(boolb)gt;b?1:two;Funclt;bool,objectgt;
lambda上的属性
从C10开始,你可以将属性放在lambda表达式上,就像对方法和本地函数一样。当有属性时,lambda的参数列表必须用括号括起来:Funclt;string,intgt;parse〔Example(1)〕(s)gt;int。Parse(s);varchoose〔Example(2)〕〔Example(3)〕object(boolb)gt;b?1:two;
就像本地函数一样,如果属性在AttributeTargets。Method上有效,则可以将属性应用于lambda。
Lambda的调用方式与方法和本地函数不同,因此在调用lambda时属性没有任何影响。但是,lambdas上的属性对于代码分析仍然有用,并且可以通过反射发现它们。
structs的改进
C10为structs引入了功能,可在structs(结构)和类之间提供更好的奇偶性。这些新功能包括无参数构造函数、字段初始值设定项、记录结构和with表达式。
01无参数结构构造函数和字段初始值设定项
在C10之前,每个结构都有一个隐式的公共无参数构造函数,该构造函数将结构的字段设置为默认值。在结构上创建无参数构造函数是错误的。
从C10开始,你可以包含自己的无参数结构构造函数。如果你不提供,则将提供隐式无参数构造函数以将所有字段设置为默认值。你在结构中创建的无参数构造函数必须是公共的并且不能是部分的:publicstructAddress{publicAddress(){Citylt;unknowngt;;}publicstringCity{get;init;}}
你可以如上所述在无参数构造函数中初始化字段,也可以通过字段或属性初始化程序初始化它们:publicstructAddress{publicstringCity{get;init;}lt;unknowngt;;}
通过默认创建或作为数组分配的一部分创建的结构会忽略显式无参数构造函数,并始终将结构成员设置为其默认值。有关结构中无参数构造函数的更多信息,请参阅结构类型。
02Recordstructs
从C10开始,现在可以使用recordstruct定义record。这些类似于C9中引入的record类:publicrecordstructPerson{publicstringFirstName{get;init;}publicstringLastName{get;init;}}
你可以继续使用record定义记录类,也可以使用record类来清楚地说明。
结构已经具有值相等当你比较它们时,它是按值。记录结构添加IEquatablelt;Tgt;支持和运算符。记录结构提供IEquatablelt;Tgt;的自定义实现以避免反射的性能问题,并且它们包括记录功能,如ToString()覆盖。
记录结构可以是位置的,主构造函数隐式声明公共成员:publicrecordstructPerson(stringFirstName,stringLastName);
主构造函数的参数成为记录结构的公共自动实现属性。与record类不同,隐式创建的属性是读写的。这使得将元组转换为命名类型变得更加容易。将返回类型从(stringFirstName,stringLastName)之类的元组更改为Person的命名类型可以清理你的代码并保证成员名称一致。声明位置记录结构很容易并保持可变语义。
如果你声明一个与主要构造函数参数同名的属性或字段,则不会合成任何自动属性并使用你的。
要创建不可变的记录结构,请将readonly添加到结构(就像你可以添加到任何结构一样)或将readonly应用于单个属性。对象初始化器是可以设置只读属性的构造阶段的一部分。这只是使用不可变记录结构的一种方法:varpersonnewPerson{FirstNameMads,LastNameTorgersen};publicreadonlyrecordstructPerson{publicstringFirstName{get;init;}publicstringLastName{get;init;}}
在本文中了解有关记录结构的更多信息。
记录结构
https:docs。microsoft。comdotnetcsharplanguagereferencebuiltintypesrecord
03Record类中ToString()上的密封修饰符
记录类也得到了改进。从C10开始,ToString()方法可以包含seal修饰符,这会阻止编译器为任何派生记录合成ToString实现。
在本文中的记录中了解有关ToString()的更多信息。
有关ToString()的更多信息
https:docs。microsoft。comdotnetcsharplanguagereferencebuiltintypesrecordbuiltinformattingfordisplay
04结构和匿名类型的表达式
C10支持所有结构的with表达式,包括记录结构,以及匿名类型:varperson2personwith{LastNameKristensen};
这将返回一个具有新值的新实例。你可以更新任意数量的值。你未设置的值将保留与初始实例相同的值。
在本文中了解有关with的更多信息
了解有关with的更多信息
https:docs。microsoft。comdotnetcsharplanguagereferencebuiltintypesrecordbuiltinformattingfordisplay
内插字符串改进
当微软在C中添加内插字符串时,微软总觉得在性能和表现力方面,使用该语法可以做更多事情。
01内插字符串处理程序
今天,编译器将内插字符串转换为对string。Format的调用。这会导致很多分配参数的装箱、参数数组的分配,当然还有结果字符串本身。此外,它在实际插值的含义上没有任何回旋余地。
在C10中,微软添加了一个库模式,允许API接管对内插字符串参数表达式的处理。例如,考虑StringBuilder。Append:varsbnewStringBuilder();sb。Append(Hello{args〔0〕},howareyou?);
到目前为止,这将使用新分配和计算的字符串调用Append(string?value)重载,将其附加到StringBuilder的一个块中。但是,Append现在有一个新的重载Append(refStringBuilder。AppendInterpolatedStringHandlerhandler),当使用内插字符串作为参数时,它优先于字符串重载。
通常,当你看到SomethingInterpolatedStringHandler形式的参数类型时,API作者在幕后做了一些工作,以更恰当地处理插值字符串以满足其目的。在微软的Append示例中,字符串Hello、args〔0〕和,howareyou?将单独附加到StringBuilder中,这样效率更高且结果相同。
有时你只想在特定条件下完成构建字符串的工作。一个例子是Debug。Assert:Debug。Assert(condition,{SomethingExpensiveHensHere()});
在大多数情况下,条件为真,第二个参数未使用。但是,每次调用都会计算所有参数,从而不必要地减慢执行速度。Debug。Assert现在有一个带有自定义插值字符串构建器的重载,它确保第二个参数甚至不被评估,除非条件为假。
最后,这是一个在给定调用中实际更改字符串插值行为的示例:String。Create()允许你指定IFormatProvider用于格式化插值字符串参数本身的洞中的表达式:String。Create(CultureInfo。InvariantCulture,Theresultis{result});
你可以在本文和有关创建自定义处理程序的本教程中了解有关内插字符串处理程序的更多信息。
创建自定义处理程序
https:docs。microsoft。comdotnetcsharplanguagereferencetokensinterpolatedcompilationofinterpolatedstrings
内插字符串处理程序的更多信息
https:docs。microsoft。comdotnetcsharpwhatsnewtutorialsinterpolatedstringhandler
02常量内插字符串
如果内插字符串的所有洞都是常量字符串,那么生成的字符串现在也是常量。这使你可以在更多地方使用字符串插值语法,例如属性:〔Obsolete(Call{nameof(Discard)}instead)〕
请注意,必须用常量字符串填充洞。其他类型,如数字或日期值,不能使用,因为它们对文化敏感,并且不能在编译时计算。其他改进
C10对整个语言进行了许多较小的改进。其中一些只是使C以你期望的方式工作。
在解构中混合声明和变量
在C10之前,解构要求所有变量都是新的,或者所有变量都必须事先声明。在C10中,你可以混合:intx2;inty2;(x2,y2)(0,1);WorksinC9(varx,vary)(0,1);WorksinC9(x2,vary3)(0,1);WorksinC10onwards
在有关解构的文章中了解更多信息。
改进的明确分配
如果你使用尚未明确分配的值,C会产生错误。C10可以更好地理解你的代码并且产生更少的虚假错误。这些相同的改进还意味着你将看到更少的针对空引用的虚假错误和警告。
在C10中的新增功能文章中了解有关C确定赋值的更多信息。
C10中的新增功能文章
https:docs。microsoft。comdotnetcsharpwhatsnewcsharp10improveddefiniteassignment
扩展的属性模式
C10添加了扩展属性模式,以便更轻松地访问模式中的嵌套属性值。例如,如果微软在上面的Person记录中添加一个地址,微软可以通过以下两种方式进行模式匹配:objectobjnewPerson{FirstNameKathleen,LastNameDollard,AddressnewAddress{CitySeattle}};if(objisPerson{Address:{City:Seattle}})Console。WriteLine(Seattle);if(objisPerson{Address。City:Seattle})ExtendedpropertypatternConsole。WriteLine(Seattle);
扩展属性模式简化了代码并使其更易于阅读,尤其是在匹配多个属性时。
在模式匹配文章中了解有关扩展属性模式的更多信息。
模式匹配文章
https:docs。microsoft。comdotnetcsharplanguagereferenceoperatorspatternspropertypattern
调用者表达式属性
CallerArgumentExpressionAttribute提供有关方法调用上下文的信息。与其他CompilerServices属性一样,此属性应用于可选参数。在这种情况下,一个字符串:voidCheckExpression(boolcondition,〔CallerArgumentExpression(condition)〕string?messagenull){Console。WriteLine(Condition:{message});}
传递给CallerArgumentExpression的参数名称是不同参数的名称。作为参数传递给该参数的表达式将包含在字符串中。例如,vara6;varbtrue;CheckExpression(true);CheckExpression(b);CheckExpression(agt;5);Output:Condition:trueCondition:bCondition:agt;5
ArgumentNullException。ThrowIfNull()是如何使用此属性的一个很好的示例。它通过默认提供的值来避免必须传入参数名称:voidMyMethod(objectvalue){ArgumentNullException。ThrowIfNull(value);}
了解有关CallerArgumentExpressionAttribute的更多信息
https:docs。microsoft。comdotnetcsharplanguagereferenceattributescallerinformationargumentexpressions
油性皮肤怎么改善油性皮肤用什么护肤品油性皮肤是指油脂分泌旺盛、额头、鼻翼有油光、毛孔粗大、触摸有黑头、皮质厚硬不光滑、外观暗黄,皮肤偏碱性,弹性较佳,不易衰老,皮肤易吸收紫外线。油性皮肤会经常出油,同时容易长痘痘……
唯美新娘发型造型时尚经典新娘妆发图片新娘的发型也是新娘妆发很重要的部分,各地的新娘发型都有所不同,经典和时尚同样惊艳,关于美的追求每个人都有自己的看法,但是真正唯美的发型,大家也都会喜欢的。新娘的发型更多的……
有你的现在第五十四章时间回到晚上十二点。凌丹在家实在是等不下去了,把自己捂得只剩下眼睛,这样子可能是她亲妈也未必认识,但是现在的阎薇薇已经怀疑她,认出她反倒是容易了。经过询问,凌丹来到……
喜小茶是喜茶旗下的吗近期,一个关于喜小茶的奶茶店爆火在互联网,很多人都在怀疑喜小茶和喜茶的关系。没错!喜小茶就是喜茶旗下的子品牌,针对大众消费的奶茶店,性价比很高。下面,我们来看看喜小茶和喜茶的关……
农村职业中专学生校外住宿情况的调查报告精选多篇第1篇第2篇第3篇第4篇第5篇更多顶部第一篇:农村职业中专学生校外住宿情况的调查报告第二篇:关于学生公寓住宿情况的调查报告第三篇:文秘一班校外住宿情况的调查材料第四篇:校……
乡村教育振兴缺的不只是一块屏幕这两天,一篇《这块屏幕可能改变命运》的报道戳中了教育不均衡的痛点,刷屏朋友圈。248所贫困地区的中学通过直播跟随成都七中同步上课。开设直播班的成都七中东方闻道网校称,16年来,……
对牛弹琴的意外结局古时候,有个叫公明仪的音乐家,他琴弹得非常好。有一次,天气非常好,他带着琴去游玩。他来到一个青山环绕的地方,心情一下子好了起来。他很想弹琴,可是附近没有一个人。这时他看到……
西游记为什么叫西游释厄传是什么意思《西游记》这本书大家都是非常熟悉,非常了解的了,对于《西游记》里面的故事很多人也都是很熟悉的。但是如果说《西游记》还有其他的名字,可能很多人都不知道吧。《西游记》还有一个名字叫……
银行工作总结标题精选多篇第1篇第2篇第3篇第4篇第5篇更多顶部第一篇:工作总结的标题第二篇:六月份工作总结标题第三篇:总结一般由标题第四篇:技术总结标题(模板)第五篇:通知标题更多相关范文正文第……
推广如何筛选优化公司标准SEO的发展前景是非常的好的,因为谁都想在搜索引擎中取得一个好的排名让更多的用户使用,获取更多的免费流量,所以我们一定要挑选一个值得信赖的SEO公司来进行合作,哪种百度SEO优……
想入驻中国质造先搞清这十点在中国质造专题出来后就有很多的卖家咨询一些入驻中国质造的问题,这边总结了一些大家常常会遇到的问题的解决方案,希望能够帮助到大家!一、中国质造商家个人店铺升级企业店铺要求……
南史到彦之传原文及翻译南史原文:到彦之,字道豫,彭城武原人,楚大夫屈到后也。宋武帝讨孙恩,以乡里乐从,每有战功。义熙元年,补镇军行参军。后以军功封佷山县子,为太尉中兵参军。武帝受命,进爵……
微信与威信官场犹如战场,微信链接威信。最近某机关正调整领导岗位,某老领导占着茅坑不拉屎,得想个办法让他下岗啊。一天,宣传部门来采访他:你有没有微信?我没有威信。第……
女生中长发中短发斜刘海发型图片甜美淑女范十足斜刘海发型一甜美气质风的一款时尚中长发烫发发型,斜刘海百搭修颜,配合蓬松的中长发烫发造型设计,达到了修饰脸型的效果,同时也显露别致时尚感的一面,棕色的染发设计则更显白皙红……
适合人类居住的第二地球格利泽或许根本不存在如今随着地球上各种资源的告急,各种能源即将被耗尽,全球温度升高,科学家们纷纷在不断的寻找适合人类居住的第二个地球。据说曾经发现的格利泽581c被称为是第二地球,甚至有研究……
如何水培绿萝要想水培绿萝成活率高,主要首先选取带有气生根的枝茎,然后配制装有雨水为基质的花瓶,定植后加入适量的营养液,每隔2~3天换水一次最佳,及时剪短过长的根系,保持温度在15~35左右……
如影岁月下部五十六这也秋后了,东头二爷爷差不多要给小君叔操办婚事了吧!是啊!快点给他们办喽吧!我咋就感觉着不稳当!哎难说啊!咋地?啥不稳当啦?咋地?你说还能咋地?没你不问……
哈药集团股份有限公司研发投入分析【摘要】医药行业属于高新技术行业,作为我国经济发展的主要产业之一,研究其研发投入对企业的影响非常有意义。哈药集团股份有限公司是全国医药行业最早的上市公司,某些产品的生产规模、产……
护腿板推荐puma护腿板跟其耐克、阿迪护腿板一样都是全球知名品牌,puma护腿板佩戴方便,而且还很轻便,因为特殊材质更好的起到防护措施,那么puma护腿板推荐有哪些?彪马evoPO……
喝水的纸杯是什么垃圾纸杯是把用化学木浆制成的原纸进行机械加工、粘合所做得的一种纸制作的容器。纸杯不论在家里还是到餐馆,一次性杯子用得越来越多,人们都认为这样既卫生又方便,那么大家知道纸杯是什么垃圾……
我家四姨娘是新中国第一代文艺兵我家四姨娘是新中国第一代文艺兵2在四姨娘生病就医期间,她有时回外公家住住,有时也到舅舅那儿住几天,多数时间还是住在四方井1大院阁楼上。妈妈告诉我们说,大院二楼上面那间小阁……
冬季备孕注意事项备孕注意事项有哪些?想要在冬天孕育宝宝的夫妻,不妨来参考一下wed114婚嫁百科为您提供的冬季备孕注意事项,这样有助于生出健康漂亮的小baby!冬季备孕注意事项:空气污染……
因家中有急事请假条精选多篇第1篇第2篇第3篇第4篇第5篇更多顶部第一篇:因家中有事的请假条第二篇:因结婚的请假条第三篇:范例二请假条(因缺席会议)第四篇:张明道先生谈(家中有字画,方是雅人家)第五……
我国中小企业管理存在的问题和不足1。管理模式粗放,管理理念落后。许多中小企业的经营者缺乏企业管理经验,他们在进入市场时是靠感觉和经验来经营和管理企业的。管理人员多为亲戚和老部门,存在非专业管理、粗放管理……