1. C# 6.0 语言预览版
您阅读本文的时候,Build(Microsoft 开发人员大会)将落下帷幕,开发人员将思考如何应对呈现在面前的这一切:立即接受、等等再看还是暂时忽略。 对于 .NET/C# 开发人员来说,最重要的公告无疑是将 C# 编译器(“Roslyn”)的下一个版本发布为开源版本。 与此相关的是语言改进本身。 即使您未计划立即采用 C# vNext(以下为非正式说法“C# 6.0”),您至少应了解它的功能,并留意那些可能值得您立即投入使用的功能。
本文中,我将深入探讨在撰写本文时(2014 年 3 月)C# 6.0 已提供功能的详细信息,或当前可从 roslyn.codeplex.com 下载的开源部分已提供功能的详细信息。 我将称之为单个版本——3 月预览版。 3 月预览版特定于 C# 的功能完全在编译器中实现,与更新的 Microsoft .NET Framework 或运行时不存在任何依赖关系。 这意味着您可以在开发过程中采用 C# 6.0,而无需为开发或部署升级 .NET Framework。 事实上,通过此版本安装 C# 6.0 编译器比安装 Visual Studio 2013 扩展涉及的事项稍多一些,因为还要更新 MSBuild 目标文件。
我在介绍每个 C# 6.0 功能时,您可能要考虑以下几点:
- 过去是否有合理的方法来编写相同的功能,以致功能主要为语法修饰(快捷方式或简化的方法)? 例如,异常筛选不具备 C# 5.0 等效功能,但主构造函数具备这样的功能。
- 3 月预览版中是否提供此功能? 我要介绍的大部分功能都提供,但有些功能(如新的二进制文字)不提供。
- 关于新语言功能,您是否有要向团队提供的任何反馈? 团队仍处于版本生命周期的相对早期阶段,非常愿意倾听您有关此版本的想法(有关反馈说明,请参阅 msdn.com/Roslyn)。
考虑此类问题有助于衡量与您自己的开发工作相关的新功能的意义。
2. 索引成员和元素初始值设定项
首先,请看看图 1 中的单元测试。
图 1 通过集合初始值设定项为集合赋值(在 C# 3.0 中添加)
[%$TOPIC/dn683793_zh-cn_MSDN_10_23_0_0%] [%$TOPIC/dn683793_zh-cn_MSDN_10_23_0_1%] [%$TOPIC/dn683793_zh-cn_MSDN_10_23_0_2%]
尽管语法有些模糊不清,但图 1 只不过是一个名称/值集合。 其实语法可以显著地简化为:<index> = <value>。 C# 6.0 通过 C# 对象初始值设定项和新的索引成员语法使之成为可能。 以下代码显示基于整数的元素初始值设定项:
请注意,尽管此代码为索引使用整数,但 Dictionary<TKey,TValue> 可以支持使用任何类型作为索引(只要其支持 IComparable<T>)。 下一个示例显示了索引数据类型的字符串,并使用索引成员初始值设定项指定元素值:
[%$TOPIC/dn683793_zh-cn_MSDN_10_31_0_0%]
[%$TOPIC/dn683793_zh-cn_MSDN_10_31_0_1%]
新的索引成员初始化附带了一个新的 $ 运算符。 此字符串索引成员语法专门用于解决基于字符串的索引普遍存在的问题。 使用图 2 中所示的这个新语法,您可以在动态成员调用(C# 4.0 中进行了介绍)中为语法中的元素赋值,而不是在上述示例使用的字符串标记中为其赋值。
图 2 使用索引成员赋值将集合初始化为元素初始值设定项的一部分
[%$TOPIC/dn683793_zh-cn_MSDN_10_36_0_0%]
[%$TOPIC/dn683793_zh-cn_MSDN_10_36_0_1%]
若要了解 $ 运算符,可以看看 AreEqual 函数调用。 请注意 builtInDataTypes 变量上“$Boolean”的 Dictionary 成员调用(即使 Dictionary 上没有“Boolean”成员,也请注意)。 这种显式成员不是必需的,因为 $ 运算符会调用 Dictionary 上的索引成员,相当于调用 buildInDataTypes["Boolean"]。
与任何基于字符串的运算符一样,字符串索引元素(例如,“Boolean”)在 Dictionary 中不进行编译时验证。 因此,任何有效的 C#(区分大小写)成员名称都可以在 $ 运算符之后出现。
为了完全把握索引成员的语法,请考虑松散类型化数据格式(如 XML、JSON 和 CSV)的字符串索引器、甚至是数据库查找(假定没有实体框架代码生成幻数)的优势。 例如,图 3 演示了使用 Newtonsoft.Json 框架的字符串索引成员的便捷性。
图 3 利用采用了 JSON 数据的索引方法
[%$TOPIC/dn683793_zh-cn_MSDN_10_45_0_0%]
[%$TOPIC/dn683793_zh-cn_MSDN_10_45_0_1%]
需要注意的最后一点是,为防止其不明显,$ 运算符语法仅使用类型字符串(如 Dictionary<string, …>)的索引。