一、索引的成员和元素初始化

1.1 原始初始化集合 Dictionary

1.2 键值初始化集合 Dictionary

1.3 运算符 $ 初始化集合 Dictionary

二、自动属性的初始化

一不小心发现 C# 已经到 6.0 了,现在项目中使用的还是 4.0,这节奏,完全跟不上啊!

虽然自己也没有使用过 6.0,既然看到了,就拿出来和园有分享一下。

看到了@dotnetgeek的评论,非常感谢,认为是给我这样浮躁的人善意的警告,不应该盲目跟风追新,应该老老实实把现在的搞清楚,万变不离其宗

我发现你是一个微软黑粉,语言的更新仅仅是多了一些特性,你懂C#4.0就可以很轻松的掌握6.0,这不是一个新技术。很多人都说跟不上,我不以为然,比如以前的委托,到了C#新版本出现了Action<T>之类的,咋一看,以为是新东西,但是经过了解之后,就知道是语法糖,所以,你懂的话,根本就不怕更新快,相反,反而会提高你的编程效率

一、索引的成员和元素初始化

1.1 原始初始化集合 Dictionary

思考一下,下面的单元测试

通过集合初始化器给一个集合赋值

        [TestMethod]
public void DictionaryIndexWithoutDotDollar()
{
Dictionary<string, string> builtInDataTypes = new Dictionary<string, string>()
{
{"Byte", "0 to 255"},
{"Boolean", "True or false."},
{"Object", "An Object."},
{"String", "A string of Unicode characters."},
{"Decimal", "±1.0 × 10e-28 to ±7.9 × 10e28"}
};
}

DictionaryIndexWithoutDotDollar

1.2 键值对始化集合 Dictionary

尽管上面的代码有些隐晦,但他还是一个键值对集合。如果语法为<index> = <value>的形式,会更加清晰,容易理解。在 C# 6.0 中,就可以通过 C# 对象初始化器和一个新的索引成员语法来初始化。

下面是基于整型元素的初始化:

            var cppHelloWorldProgram = new Dictionary<int, string>

            {

                [] = "main() {",

                [] = "    printf(\"hello, world\")",

                [] = "}"

            };

            Assert.AreEqual(, cppHelloWorldProgram.Count);

IndexValue

注意:尽管实例化代码使用整数作为索引,但 Dictionary<TKey,TValue> 是支持任何类型作为索引(只要该索引支持 IComparable<T>)。

下面介绍一个使用字符串作为索引类型,并使用索引成员初始化器指定元素值

            Dictionary<string, string> builtInDataTypes =
new Dictionary<string, string>
{
["Byte"] = "0 to 255",
// ...
// Error: mixing object initializers and
// collection initializers is invalid
// {" Boolean", "True or false."},
["Object"] = "An Object.",
["String"] = "A string of Unicode characters.",
["Decimal"] = "±1.0 × 10e?28 to ±7.9 × 10e28"
};

IndexValue

 

1.3 运算符 $ 初始化集合 Dictionary

随着新的索引成员初始化器出现的还有一个新运算符 “$”(难道他的灵感来自于ps,自己瞎猜的)。字符串索引成员语法是提供给基于字符串索引使用的。使用该新语法,更像是动态成员调用,而非上面字符串的表示。

下面是一个例子

        [TestMethod]
public void DictionaryIndexWithDotDollar()
{
Dictionary<string, string> builtInDataTypes =
new Dictionary<string, string>
{
$Byte = "0 to 255", // Using indexed members in element initializers
// ...
$Boolean = "True or false.",
$Object = "An Object.",
$String = "A string of Unicode characters.",
$Decimal = "±1.0 × 10e?28 to ±7.9 × 10e28"
};
Assert.AreEqual("True or false.", builtInDataTypes.$Boolean);
}

DictionaryIndexWithDotDollar

为了理解运算符“$”,请留意调用的 AreEqual 方法。有没有注意到 builtInDataTypes 变量调用 dictionary 的成员 “$Boolean”,但是在 dictionary 中没有 “Boolean” 成员。因为运算符 “$” 调用 dictionary 中的索引成员,就等同于 buildInDataTypes["Boolean"],所以使用运算符 “$” 时,不需要明确指出索引。

作为基于字符串的运算,编译时没有验证字符串索引在 dictionary 中是否存在。也就是说,只要是合法的C#成员(区分大小写)在运算符 “$”($+”C#成员”)。

更加令人意外的索引成员语法是,考虑了字符串索引在若弱类型数据(如:XML、JSON、CSV、甚至是数据库查找)种的优势。下面是一个,使用Newtonsoft.Json框架很方便的使用字符串索引成员的例子。

[TestMethod]
public void JsonWithDollarOperatorStringIndexers()
{
// Additional data types eliminated for elucidation
string jsonText = @"
{
'Byte': {
'Keyword': 'byte',
'DotNetClassName': 'Byte',
'Description': 'Unsigned integer',
'Width': '8',
'Range': '0 to 255'
},
'Boolean': {
'Keyword': 'bool',
'DotNetClassName': 'Boolean',
'Description': 'Logical Boolean type',
'Width': '8',
'Range': 'True or false.'
},
}";
JObject jObject = JObject.Parse(jsonText);
Assert.AreEqual("bool", jObject.$Boolean.$Keyword);
}

JsonWithDollarOperatorStringIndexers

最后需要注意一点,例子可能不是很明显,上面运算符 “$” 的语法只适用于索引是字符串类型(如Dictionary<string,…>)

二、自动属性初始化

初始化类总是让人很厌烦。思考下,例如,一个简单的自定义集合类型(如,Queue<T>),在其内部维护一个私有 System.Collections.Generic.List<T> 属性列表。当实例化集合时,就必须初始化这个包含列表的队列,但是,对于一个属性,这样做的合理方案是支持的字段需要有一个初始化器或其他构造函数,但是,这种组合的方式代码量几乎会翻番。

用C#6.0中,有一个捷径:自动属性初始化。现在,就可以指定直接初始化,代码如下:

    internal class Queue<T>
{
private List<T> InternalCollection { get; } = new List<T> ;
// Queue Implementation
// ...
}

Queue

注意:上面的情况,属性是只读的没有定义 setter。属性是在声明时被赋值的。带有 setter 的读/写属性也是支持的。

更多内容请参考http://msdn.microsoft.com/en-us/magazine/dn683793.aspx

C# 6.0 功能预览 (一)的更多相关文章

  1. C# 6.0 功能预览 (二)

    在Language Feature Status上面看到,其实更新的并不是特别多,为了不会误导看了C# 6.0 功能预览 (一)的园友,现在把官方的更新列表拿了过来,供大家参考 Roslyn 编译平台 ...

  2. C# 6.0 功能预览

    C# 6.0 功能预览 (一) 一.索引的成员和元素初始化 1.1 原始初始化集合 Dictionary 1.2 键值初始化集合 Dictionary 1.3 运算符 $ 初始化集合 Dictiona ...

  3. Kafka Eagle 3.0.1功能预览

    1.概述 最近有同学留言,关于Kafka Eagle的一些使用问题.今天笔者就为大家来详细介绍Kafka Eagle 3.0.1的功能以及使用方法. 2.内容 在3.0.1版本中,EFAK优化了分布式 ...

  4. 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 2、数据框架 和 功能预览

    说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...

  5. HarmonyOS 3.0.0开发者预览版全新发布

    2021年10月22日在华为开发者大会HDC.Together 2021 主题演讲上,我们发布了HarmonyOS 3.0.0开发者预览版,主要内容包括:Harmony设计系统.ArkUI 3.0.A ...

  6. SLAM+语音机器人DIY系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  7. Spark3.0 preview预览版尝试GPU调用(本地模式不支持GPU)

    Spark3.0 preview预览版可以下载使用,地址:https://archive.apache.org/dist/spark/spark-3.0.0-preview/,pom.xml也可以进行 ...

  8. 【纯技术贴】.NETStandard FreeSql v0.0.9 功能预览

    年关将至,首页技术含量文章真是越来越少,理解大家盼着放假过年,哥们我何尝不是,先给大家拜个早年. 兄弟我从11月底发了神经,开启了 ORM 功能库的开发之旅,历时两个月编码和文档整理,目前预览版本更新 ...

  9. Redis集群功能预览

    目前Redis Cluster仍处于Beta版本,Redis 3.0将会加入,在此可以先对其主要功能和原理进行一个预览.参考<Redis Cluster - a pragmatic approa ...

随机推荐

  1. Android 如何判断一个应用在运行(转)

    Android 如何判断一个应用在运行  在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...

  2. Mac下没有权限启动tomcat的解决办法

    问题描述 在Mac中通过./startup.sh执行启动脚本文件,启动tomcat时报如下错误: -bash: ./startup.sh: Permission denied 解决方法 错误信息说明了 ...

  3. Unity4、Unity5移动平台多线程渲染在部分安卓手机上会造成闪退

    你看到的crash堆栈可能是这样的: SIGSEGV(SEGV_MAPERR)   #00  pc 0001276c                          /system/lib/libc ...

  4. NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?

    NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591  单片机解密 #####[ ...

  5. ViewPager 简单实现左右无限滑动.

    只需在在适配器中将getCount 给一个较大的值, 然后将currentItem 设为值的一半 就可以伪实现 无限循环. private static final int PAGE_COUNT = ...

  6. fmt 标签格式化 日期

    <td class='center'> <fmt:formatDate value="${RecordMail.SendTime }" pattern=" ...

  7. find out the neighbouring max D_value by counting sort in stack

    #include <stdio.h> #include <malloc.h> #define MAX_STACK 10 ; // define the node of stac ...

  8. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  9. LeetCode刷刷记录

    一遍考研,一遍还是要刷刷题.感觉自己的时间安排的不是很好,还是要抓紧自己的日常时间,当然,也要练练刷题的手感. 1.第一题就两重循环找到索引就OK,因为是无序的,所以就不能用二分来查找,题目中每个数的 ...

  10. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...