微软正式发布C#10字符串调用隐式

阅读VisualStudio2022公告和.NET6公告以了解更多信息,包括如何安装。

VisualStudio2022公告

.NET6

全局和隐式usings

using指令简化了你使用命名空间的方式。C#10包括一个新的全局using指令和隐式usings,以减少你需要在每个文件顶部指定的usings数量。

全局using指令

如果关键字global出现在using指令之前,则using适用于整个项目:

globalusingSystem;

你可以在全局using指令中使用using的任何功能。例如,添加静态导入类型并使该类型的成员和嵌套类型在整个项目中可用。如果你在using指令中使用别名,该别名也会影响你的整个项目:

globalusingstaticSystem.Console;globalusingEnv=System.Environment;

你可以将全局使用放在任何.cs文件中,包括Program.cs或专门命名的文件,如globalusings.cs。全局usings的范围是当前编译,一般对应当前项目。

有关详细信息,请参阅全局using指令。

隐式usings

隐式usings功能会自动为你正在构建的项目类型添加通用的全局using指令。要启用隐式usings,请在.csproj文件中设置ImplicitUsings属性:

enable

一些特定全局using指令集取决于你正在构建的应用程序的类型。例如,控制台应用程序或类库的隐式usings不同于ASP.NET应用程序的隐式usings。

Combiningusing功能

文件顶部的传统using指令、全局using指令和隐式using可以很好地协同工作。隐式using允许你在项目文件中包含适合你正在构建的项目类型的.NET命名空间。全局using指令允许你包含其他命名空间,以使它们在整个项目中可用。代码文件顶部的using指令允许你包含项目中仅少数文件使用的命名空间。

无论它们是如何定义的,额外的using指令都会增加名称解析中出现歧义的可能性。如果遇到这种情况,请考虑添加别名或减少要导入的命名空间的数量。例如,你可以将全局using指令替换为文件子集顶部的显式using指令。

如果你需要删除通过隐式usings包含的命名空间,你可以在项目文件中指定它们:

你还可以添加命名空间,就像它们是全局using指令一样,你可以将Using项添加到项目文件中,例如:

文件范围的命名空间

许多文件包含单个命名空间的代码。从C#10开始,你可以将命名空间作为语句包含在内,后跟分号且不带花括号:

namespaceMyCompany.MyNamespace;classMyClass//Note:noindentation

对lambda表达式和方法组的改进

微软对lambda的语法和类型进行了多项改进。微软预计这些将广泛有用,并且驱动方案之一是使ASP.NETMinimalAPI更加简单。

lambda的语法

ASP.NETMinimalAPI

lambda的自然类型

Lambda表达式现在有时具有“自然”类型。这意味着编译器通常可以推断出lambda表达式的类型。

到目前为止,必须将lambda表达式转换为委托或表达式类型。在大多数情况下,你会在BCL中使用重载的Func<...>或Action<...>委托类型之一:

Funcparse=(strings)=>int.Parse(s);

但是,从C#10开始,如果lambda没有这样的“目标类型”,微软将尝试为你计算一个:

varparse=(strings)=>int.Parse(s);

你可以在你最喜欢的编辑器中将鼠标悬停在varparse上,然后查看类型仍然是Func。一般来说,编译器将使用可用的Func或Action委托(如果存在合适的委托)。否则,它将合成一个委托类型(例如,当你有ref参数或有大量参数时)。

并非所有lambda表达式都有自然类型——有些只是没有足够的类型信息。例如,放弃参数类型将使编译器无法决定使用哪种委托类型:

varparse=s=>int.Parse(s);//ERROR:Notenoughtypeinfointhelambda

lambda的自然类型意味着它们可以分配给较弱的类型,例如object或Delegate:

objectparse=(strings)=>int.Parse(s);//FuncDelegateparse=(strings)=>int.Parse(s);//Func

当涉及到表达式树时,微软结合了“目标”和“自然”类型。如果目标类型是LambdaExpression或非泛型Expression(所有表达式树的基类型)并且lambda具有自然委托类型D,微软将改为生成Expression:

LambdaExpressionparseExpr=(strings)=>int.Parse(s);//Expression>ExpressionparseExpr=(strings)=>int.Parse(s);//Expression>

方法组的自然类型

方法组(即没有参数列表的方法名称)现在有时也具有自然类型。你始终能够将方法组转换为兼容的委托类型:

Funcread=Console.Read;Actionwrite=Console.Write;

现在,如果方法组只有一个重载,它将具有自然类型:

varread=Console.Read;//Justoneoverload;Funcinferredvarwrite=Console.Write;//ERROR:Multipleoverloads,can'tchoose

lambda的返回类型

在前面的示例中,lambda表达式的返回类型是显而易见的,并被推断出来的。情况并非总是如此:

varchoose=(boolb)=>b1:"two";//ERROR:Can'tinferreturntype

在C#10中,你可以在lambda表达式上指定显示返回类型,就像在方法或本地函数上一样。返回类型在参数之前。当你指定一个显示的返回类型时,参数必须用括号括起来,这样编译器或其他开发人员不会太混淆:

varchoose=object(boolb)=>b1:"two";//Func

lambda上的属性

从C#10开始,你可以将属性放在lambda表达式上,就像对方法和本地函数一样。当有属性时,lambda的参数列表必须用括号括起来:

Funcparse=[Example(1)](s)=>int.Parse(s);varchoose=[Example(2)][Example(3)]object(boolb)=>b1:"two";

就像本地函数一样,如果属性在AttributeTargets.Method上有效,则可以将属性应用于lambda。

Lambda的调用方式与方法和本地函数不同,因此在调用lambda时属性没有任何影响。但是,lambdas上的属性对于代码分析仍然有用,并且可以通过反射发现它们。

structs的改进

C#10为structs引入了功能,可在structs(结构)和类之间提供更好的奇偶性。这些新功能包括无参数构造函数、字段初始值设定项、记录结构和with表达式。

01无参数结构构造函数和字段初始值设定项

在C#10之前,每个结构都有一个隐式的公共无参数构造函数,该构造函数将结构的字段设置为默认值。在结构上创建无参数构造函数是错误的。

从C#10开始,你可以包含自己的无参数结构构造函数。如果你不提供,则将提供隐式无参数构造函数以将所有字段设置为默认值。你在结构中创建的无参数构造函数必须是公共的并且不能是部分的:

publicstructAddresspublicAddress()City="";publicstringCity{get;init;}

你可以如上所述在无参数构造函数中初始化字段,也可以通过字段或属性初始化程序初始化它们:

publicstructAddresspublicstringCity{get;init;}="";

通过默认创建或作为数组分配的一部分创建的结构会忽略显示无参数构造函数,并始终将结构成员设置为其默认值。有关结构中无参数构造函数的更多信息,请参阅结构类型。

02Recordstructs

从C#10开始,现在可以使用recordstruct定义record。这些类似于C#9中引入的record类:

publicrecordstructPersonpublicstringFirstName{get;init;}publicstringLastName{get;init;}

你可以继续使用record定义记录类,也可以使用record类来清楚地说明。

结构已经具有值相等——当你比较它们时,它是按值。记录结构添加IEquatable支持和==运算符。记录结构提供IEquatable的自定义实现以避免反射的性能问题,并且它们包括记录功能,如ToString()覆盖。

publicrecordstructPerson(stringFirstName,stringLastName);

要创建不可变的记录结构,请将readonly添加到结构(就像你可以添加到任何结构一样)或将readonly应用于单个属性。对象初始化器是可以设置只读属性的构造阶段的一部分。这只是使用不可变记录结构的一种方法:

varperson=newPerson{FirstName="Mads",LastName="Torgersen"};publicreadonlyrecordstructPersonpublicstringFirstName{get;init;}publicstringLastName{get;init;}

在本文中了解有关记录结构的更多信息。

记录结构

03Record类中ToString()上的密封修饰符

记录类也得到了改进。从C#10开始,ToString()方法可以包含seal修饰符,这会阻止编译器为任何派生记录合成ToString实现。

在本文中的记录中了解有关ToString()的更多信息。

有关ToString()的更多信息

04结构和匿名类型的表达式

C#10支持所有结构的with表达式,包括记录结构,以及匿名类型:

varperson2=personwith{LastName="Kristensen"};

这将返回一个具有新值的新实例。你可以更新任意数量的值。你未设置的值将保留与初始实例相同的值。

在本文中了解有关with的更多信息

了解有关with的更多信息

内插字符串改进

当微软在C#中添加内插字符串时,微软总觉得在性能和表现力方面,使用该语法可以做更多事情。

01内插字符串处理程序

今天,编译器将内插字符串转换为对string.Format的调用。这会导致很多分配——参数的装箱、参数数组的分配,当然还有结果字符串本身。此外,它在实际插值的含义上没有任何回旋余地。

在C#10中,微软添加了一个库模式,允许API“接管”对内插字符串参数表达式的处理。例如,考虑StringBuilder.Append:

varsb=newStringBuilder();sb.Append($"Hello{args[0]},howareyou");

到目前为止,这将使用新分配和计算的字符串调用Append(stringvalue)重载,将其附加到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}");

你可以在本文和有关创建自定义处理程序的本教程中了解有关内插字符串处理程序的更多信息。

创建自定义处理程序

内插字符串处理程序的更多信息

02常量内插字符串

如果内插字符串的所有洞都是常量字符串,那么生成的字符串现在也是常量。这使你可以在更多地方使用字符串插值语法,例如属性:

[Obsolete($"Call{nameof(Discard)}instead")]

请注意,必须用常量字符串填充洞。其他类型,如数字或日期值,不能使用,因为它们对文化敏感,并且不能在编译时计算。

其他改进

C#10对整个语言进行了许多较小的改进。其中一些只是使C#以你期望的方式工作。

intx2;inty2;(x2,y2)=(0,1);//WorksinC#9(varx,vary)=(0,1);//WorksinC#9(x2,vary3)=(0,1);//WorksinC#10onwards

改进的明确分配

如果你使用尚未明确分配的值,C#会产生错误。C#10可以更好地理解你的代码并且产生更少的虚假错误。这些相同的改进还意味着你将看到更少的针对空引用的虚假错误和警告。

扩展的属性模式

C#10添加了扩展属性模式,以便更轻松地访问模式中的嵌套属性值。例如,如果微软在上面的Person记录中添加一个地址,微软可以通过以下两种方式进行模式匹配:

objectobj=newPersonFirstName="Kathleen",LastName="Dollard",Address=newAddress{City="Seattle"}if(objisPerson{Address:{City:"Seattle"}})Console.WriteLine("Seattle");if(objisPerson{Address.City:"Seattle"})//ExtendedpropertypatternConsole.WriteLine("Seattle");

扩展属性模式简化了代码并使其更易于阅读,尤其是在匹配多个属性时。

调用者表达式属性

CallerArgumentExpressionAttribute提供有关方法调用上下文的信息。与其他CompilerServices属性一样,此属性应用于可选参数。在这种情况下,一个字符串:

voidCheckExpression(boolcondition,[CallerArgumentExpression("condition")]stringmessage=null)Console.WriteLine($"Condition:{message}");

传递给CallerArgumentExpression的参数名称是不同参数的名称。作为参数传递给该参数的表达式将包含在字符串中。例如,

vara=6;varb=true;CheckExpression(true);CheckExpression(b);CheckExpression(a>5);//Output://Condition:true//Condition:b//Condition:a>5

ArgumentNullException.ThrowIfNull()是如何使用此属性的一个很好的示例。它通过默认提供的值来避免必须传入参数名称:

voidMyMethod(objectvalue){ArgumentNullException.ThrowIfNull(value);}

THE END
1.VisualC++2010Visual C++ 2010? ? ? ? ? API ? ? ? . https://learn.microsoft.com/ko-kr/archive/msdn-magazine/2009/february/windows-with-c-visual-c-2010-and-the-parallel-patterns-library
2.microsoftvisualc++2010vc2010安装包免费下载vc2010最新版vc2010又叫vc++2010,是微软官方发布的运行库组件,只有安装了vc2010才能够运行开发工具,visual c++2010实质是visial studio的一个部分,主要用于开发各种c++应用程序。如果你电脑没有安装vc2010,有些大型程序也要把相关运行库安装程序前安装好,不然的话是无法运行某些游戏的,如果各位需要的话,快来当易网下载吧! http://www.downyi.com/key/vc2010/
3.VC2010(MicrosoftVisualC++2010x86)下载官方简体中文【游戏介绍】本工具为 VC2010 Microsoft Visual C++ 2010 x86 官方简体中文版。由微软发布的Microsoft Visual C++ 2010运行库的分发包,安装该运行库后您的计算机将可以运行Visual C++ 2010编写的程序,即使您并未安装Visual Studio 2010。Visual C++ 20http://www.962.net/patch/6960.html
4.vc2010sp1运行库VisualC++2010SP1下载x86/x64官vc2010SP1运行库解决程序或游戏运行时提示“应用程序配置不正确”的错误,Visual C++ 2010 的计算机上运行使用 Visual C++ 开发的应用程序运行库。VC2010 SP1安装 C 运行时 (CRT)、标准 C++、ATL、MFC、OpenMP 和 MSDIA 库的运行时组件。 官方下载地址: https://www.itmop.com/downinfo/13631.html
5.《VisualC++2010入门经典(第5版)》(霍顿(IvorHorton))简介当当网图书频道在线销售正版《Visual C++2010入门经典(第5版)》,作者:霍顿(Ivor Horton),出版社:清华大学出版社。最新《Visual C++2010入门经典(第5版)》简介、书评、试读、价格、图片等相关信息,尽在DangDang.com,网购《Visual C++2010入门经典(第5版)》,就http://product.dangdang.com/product.aspx?product_id=20997176
6.microsoftvisualc++2010下载Microsoft Visual C++ 2010是一款由微软公司开的集成开发环境(IDE),用于C++编程。它提供了丰富的工具和功能,可以帮助开发人员创建高性能的C++应用程序。 要下载Microsoft Visual C++ 2010,您可以按照以下步骤进行操作: 打开您的浏览器,并访问微软官方网站。 在搜索框中输入"Microsoft Visual C++ 2010下载",然后按下https://wenku.csdn.net/answer/2iezfmhxvn
7.《VisualC++2010入门经典》完全版.pdf内容提供方:max 大小:15.14 MB 字数:约小于1千字 发布时间:2018-11-21发布于陕西 浏览人气:357 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币(10金币=人民币1元) 《Visual C++ 2010入门经典》完全版.pdf 关闭预览 想预览更多内容,点击免费在线预览全文 https://max.book118.com/html/2018/1119/7013016156001160.shtm
8.VisualC++2010运行库下载VC++2010运行库中文版下载VisualC++2010运行库是用于在 Windows 上运行使用 Microsoft Visual C++ 2010 编写的应用程序所必需的。如果您需要运行使用 Microsoft Visual C++ 编写的应用程序,则需要安装 Visual C++ 运行库。 Microsoft Visual C++ 2010 Redistributable Package (x86) 安装在未安装 Visual C++ 2010 的计算机上运行使用 Visual C++ https://www.duotegame.com/pcgame/887598.html
9.microsoftvisualc++2010redistributable下载PC软件microsoft visual c++ 2010 redistributable是一款开发人员必备的工具之一,是安装在未安装Visual C++ 2010的计算机上运行使用的Visual C++开发的应用程序。有需要的朋友可以到本站进行下载! visual c++ 2010 介绍: Microsoft Visual C++ 2010 Redistributable Package 安装 Visual C++ 库的运行时组件,使用户能够在未安装 Vihttps://www.niupu.org/detail/soft/28989.html
10.VisualC++2010中文版下载Visual C++ 2010中文版是一款功能强大的C++编程软件,软件提供了丰富的工具集合,包括文本编辑器、编译器、调试器和库管理系统,支持Windows应用程序的开发,可以利用Visual C++ 2010创建桌面应用、控制台程序、动态链接库等,提高开发效率,感兴趣的赶快下载使用吧! https://soft.3dmgame.com/down/322331.html
11.MicrosoftVisualC++2010SP1运行库(x86)下载Microsoft Visual C++ 2010 SP1 运行库 (x86) 简介:Microsoft Visual C++ 2010 SP1 运行库 (x86) 逗游评分4.7 时代标杆 1268 详细信息 系统类别:系统网站:逗游软件语言:英文驱动授权:免费更新时间:2016-11-01 16:59:26驱动平台:XPVistaWin7https://www.doyo.cn/soft/90000371
12.VisualC++2010入门经典(豆瓣)《Visual C++2010入门经典(第5版)》作者ivor horton采用了容易理解的讲授方法,并提供了详尽的示例,使读者很快就可以成为一名优秀的C++程序员。《Visual C++2010入门经典(第5版)》针对visual C++ 2010版本做了全面更新,介绍了最新开发环境,讲述了如何使用visual C++构建真实世界的应用程序。《Visual C++2010入门经典(第https://book.douban.com/subject/5410367/
13.VisualC++2010入门经典《Visual C++2010入门经典(第5版)》作者ivor horton采用了容易理解的讲授方法,并提供了详尽的示例,使读者很快就可以成为一名优秀的C++程序员。《Visual C++2010入门经典(第5版)》针对visual C++ 2010版本做了全面更新,介绍了开发环境,讲述了如何使用visual C++构建真实世界的应用程序。《Visual C++2010入门经典(第5版https://lib-xpu.wqxuetang.com/book/1267
14.MicrosoftVisualC++2010RedistributablePackage(x86x64)下载Microsoft Visual C++ 2010 Redistributable Package是微软公司提供的一款重要的软件包,旨在帮助用户在其计算机上运行使用Visual C++ 2010编写的程序。该软件包分为x86和x64两个版本,分别适用于32位和64位的操作系统。 最新版本:https://patch.ali213.net/showpatch/130697.html https://patch.ali213.net/showpatch/10659.html
15.MicrosoftVisualC++2010学习版清华教育在线系列软件https://etcnew.sdut.edu.cn/meol/common/script/preview/download_preview.jsp?fileid=1501915&resid=1154828&lid=56115&preview=preview
16.visualc++2010入门经典第5版pdf下载霍顿高清扫描visual c++2010入门经典第5版是一本C++代码入门经典,由霍顿(Ivor Horton)编著,苏正,李文娟共同翻译。本书使用了visual C++ 2010支持的两种C++语言技术来讲述C++编程的基础知识,讨论了每一个windows应用程序的结构和基本元素,举例说明了如何用mfc开发本地windows应用程序,提供了大量可以工作的示例和练习,旨在帮助读者掌握https://www.ddooo.com/softdown/115331.htm
17.VC2010(MicrosoftVisualC++2010)简体中文版下载VC2010(Microsoft Visual C++ 2010 Redistributable Package) 安装 Visual C++ (vc2010)库的运行时组件,使用户能够在未安装 Visual C++ 2010(vc2010下载)的计算机上运行使用 Visual C++ 开发的应用程序。vc2010运行库软件(vc2010)包安装 C 运行时 (CRT)、标准 C++、ATL、MFC、OpenMP 和 MSDIA 库的运行时组件。软https://www.crsky.com/soft/27623.html
18.VisualC++2010ExpressVisual C++ 2010 Express, free and safe download. Visual C++ 2010 Express latest version: Essential toolkit for Visual C++.http://visual-c-express.en.softonic.com/
19.VisualC++2010入门经典(第5版)Visual C++ 2010入门经典 作者:霍顿 ISBN:9787302239994 出版社:清华大学出版社 出版年:2010 Visual C++ 2013入门经典(第7版) 作者:(美)霍尔顿(Horton,I.)著 出版社:清华大学出版社 出版年:2015 Visual Basic 2010入门经典(第6版) 作者:吴伟敏等译 ISBN:9787302270058 出版社:清华大学出版社 出版年:2011 https://www.las.ac.cn/front/book/detail?id=2a4d8386282f4743b1f548b9da484f17