0. 目录

C#6 新增特性目录

1. 老版本的代码

 private static void Main()
{
var dictionary = new Dictionary<int, string> {
{ , "Value1" },
{ , "Value2" },
{ , "Value3" }
};
}

早C#3中引入的集合初始化器,可是让我们用上面的语法来在声明一个字典或者集合的时候立即初始化一些项进去,其实在C#3中这是个语法糖,实质编译后的结果是调用字典或者集合的Add方法逐一添加这些项。但是有一点小小的不直观。先看看这个版的IL吧:

 .method private hidebysig static void  Main() cil managed
{
.entrypoint
// Code size 47 (0x2f)
.maxstack
.locals init ([] class [mscorlib]System.Collections.Generic.Dictionary`<int32,string> dictionary)
IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::.ctor()
IL_0006: dup
IL_0007: ldc.i4.
IL_0008: ldstr "Value1"
IL_000d: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::Add(!,
!)
IL_0012: nop
IL_0013: dup
IL_0014: ldc.i4.
IL_0015: ldstr "Value2"
IL_001a: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::Add(!,
!)
IL_001f: nop
IL_0020: dup
IL_0021: ldc.i4.
IL_0022: ldstr "Value3"
IL_0027: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::Add(!,
!)
IL_002c: nop
IL_002d: stloc.
IL_002e: ret
} // end of method Program::Main

本质是Add方法的调用.C#6引入了一种新语法来进一步的优化这种写法。

2. 索引初始化器

 private static void Main()
{
var dictionary = new Dictionary<int, string>
{
[] = "Value1",
[] = "Value2",
[] = "Value3"
};
}

看起来直观许多了吧,其实是一种语法改进。编译结果也有些许差异,如下:

 .method private hidebysig static void  Main() cil managed
{
.entrypoint
// Code size 47 (0x2f)
.maxstack
.locals init ([] class [mscorlib]System.Collections.Generic.Dictionary`<int32,string> dictionary)
IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::.ctor()
IL_0006: dup
IL_0007: ldc.i4.
IL_0008: ldstr "Value1"
IL_000d: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::set_Item(!,
!)
IL_0012: nop
IL_0013: dup
IL_0014: ldc.i4.
IL_0015: ldstr "Value2"
IL_001a: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::set_Item(!,
!)
IL_001f: nop
IL_0020: dup
IL_0021: ldc.i4.
IL_0022: ldstr "Value3"
IL_0027: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`<int32,string>::set_Item(!,
!)
IL_002c: nop
IL_002d: stloc.
IL_002e: ret
} // end of method Program::Main

主要差异在于老语法是调用Add方法,新语法是用的索引器的set访问器(set_Item)。

既然是索引,那么就索引就不仅仅只能是int,也可以是string,任意的自定义类型。

3. Example

namespace csharp6
{
internal class Program
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; } private Dictionary<string, Address> _cache = new Dictionary<string, Address>(); public Address this[string name]
{
get { return _cache[name]; }
set { _cache[name] = value; }
}
} public class Address
{
public string Name { get; set; }
public string Zip { get; set; }
} private static void Main()
{
//string索引
var colorMap = new Dictionary<string, ConsoleColor>
{
["Error"] = ConsoleColor.Red,
["Information"] = ConsoleColor.Yellow,
["Verbose"] = ConsoleColor.White
}; //枚举索引
var colors = new Dictionary<ConsoleColor, string>
{
[ConsoleColor.Red] = "#F00",
[ConsoleColor.Green] = "#0F0",
}; //自定义类型的索引器支持
Person person = new Person
{
Name = "blackheart",
Age = ,
["home"] = new Address { Name = "北京市", Zip = "" },
["work"] = new Address { Name = "南京市", Zip = "" }
}; //自定义类型索引
var persons = new Dictionary<Person, List<Address>>
{
[new Person { Name = "blackheart", Age = }] = new List<Address> {
new Address { Name = "北京市", Zip = "" }
},
[new Person { Name = "blackheart", Age = }] = new List<Address> {
new Address { Name = "南京市", Zip = "" }
},
};
}
}
}

4. 总结

从本质来看,[xxx]=yyy这种语法,xxx可以是任意类型,凡是有索引器支持的类型,均可以使用这种语法。简单直接明了。

[C#6] 7-索引初始化器的更多相关文章

  1. .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

    开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...

  2. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  3. C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询

    1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...

  4. .NET 中创建支持集合初始化器的类型

    对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰.至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些. 本文将编写一个类型,可以使用集合初始化器构造这个类型.不只是添 ...

  5. C#_基础,初始化器

    对象初始化器 在没有对象初始化器之前,我们创建一个对象大概需要经过这么两个步骤,首先new一个对象,然后给每个字段赋值.而有了对象初始化器之后,原本需要几行代码才能完成的任务变成一行代码就可以完成,简 ...

  6. 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

    1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...

  7. swift_初始化器的使用

    //: Playground - noun: a place where people can play import Cocoa ***************************结构体与Cla ...

  8. Linq专题之集合初始化器

    集合初始化器用来初始化一个集合,和对象初始化器有点类似,都是用一对{}来初始化. using System; using System.Collections.Generic; using Syste ...

  9. Linq专题之对象初始化器

    在C#3.0之前,如果创建一个新的对象,往往需要调用类的构造函数来初始化该对象的值,在c#3.0提供了一个"对象初始化器"的机制,使得开发人员在创建新的对象时不通过调用类的构造函数 ...

随机推荐

  1. 在Windows环境中开始Docker的学习和体验

    研究docker有一段时间了,当然我主要的使用环境还是在Linux中,确实很方便. 但也有不少朋友希望使用Windows来工作学习,这里介绍一下在Windows中如何快速开始Docker的学习和体验吧 ...

  2. 近期博客内容的规划(关于Swift语言)

    因为最近事情比较多,有一段时间没有发表博客了.前一段时间,利用空余时间翻译了一本关于Swif的书籍,过一段时间就会出版吧.通过翻译此书,英语水平没提高多少,不过Swift算是系统的学习了一下. 在翻译 ...

  3. WCF 实体更改发布后,如何不影响调用方?

    应用场景:使用 WCF 有一个坏处,就是如果我们经常对 WCF 应用程序更新,有时候调用方也要进行 Update Service,但调用方往往会很多,那么这个工作就会很讨厌,比如 WCF Servic ...

  4. Difference Between HashMap and IdentityHashMap--转

    原文地址:https://dzone.com/articles/difference-between-hashmap-and Most of the time I use HashMap whenev ...

  5. java.util.ConcurrentModificationException异常处理

    ConcurrentModificationException异常处理 ConcurrentModificationException异常是Iterator遍历ArrayList或者HashMap数组 ...

  6. Bootstrap3 Grid system原理及应用

    刚开始用Bootstrap的格子系统写布局的时候遇到了这样一个问题: 我的页面中有这样一个布局 我希望当屏幕的宽度小于他们俩宽度之和的时候,右边的部分会掉下来,他们垂直摆放. 而我用col-xs-6的 ...

  7. java数据类型

    对String来说,”==“是用来判断两个字符串(对象)的地址是否相同,即判断是否是同一个字符串的应用.”equals()“则是判断两个字符串(对象)的值是否相等,如果相等则返回true.一般情况下, ...

  8. Hibernate 表映射 主键生成策略与复合主键

    主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射  Hibernate封装了数据库DDL语句,只需要将数据 ...

  9. PHP页面跳转(PHP笔记)

    目前学习到三种方法: 1.调用js跳转 2.header()跳转 3.调用HTML方法实现 因为一直在自己学习没有进入项目,并不知道哪个更常使用. 调用js跳转. <?php //这里是跳转方法 ...

  10. 对于UDS(ISO14229-2006) 汉译的声明(必读)

    本系列文章系作者个人翻译,最初目的为方便以后阅读和锻炼英语能力,欢迎读者参阅品鉴,本文不正确之处欢迎读者指出. 本文在此声明著作权利:转载必须注明出处,修改必须通知本作者