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. MUI APP防止登陆页面出现白屏

    最近在用MUI开发APP,总体效果,在IOS上,是完美的,但是在低端的Android手机上,就会出现性能问题,我个人觉得最严重的是,就是首页,就是APP打开的第一个页面,在iOS上,由于性能高,所以, ...

  2. react+redux教程(四)undo、devtools、router

    上节课,我们介绍了一些es6的新语法:react+redux教程(三)reduce().filter().map().some().every()....展开属性 今天我们通过解读redux-undo ...

  3. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  4. 如何利用Python生成随机密码

    写了个程序,主要是用来检测MySQL数据库的空密码和弱密码的, 在这里,定义了三类弱密码: 1. 连续数字,譬如123456,在get_weak_num中实现 2. 连续字母,譬如abcdef,在ge ...

  5. Struts2环境下Tomcat启动异常:Exception starting filter struts2,报了一个java.lang.ClassNotFoundException

    在写一个struts2+hibernate整合的小例子时,启动Tomcat服务器,报了一个: 严重: Exception starting filter struts2java.lang.ClassN ...

  6. 你不知道的HttpHandler相关知识

    一.关于IHttpHandler.IsReusable 很多人不明白,这哥们到底干嘛的,估计是微软最初的一个想法--让一个对象可以一直不断地被重复使用 ,但这个想法不成熟,会带来很多隐藏问题,一个对象 ...

  7. 简单回顾NPOI导入导出excel文件

    当前环境.net4.0 去官方下下载:  NOPI官网 关于NOPI的详细,这里就不再介绍. 在项目中,我们只需引入  NPOI.dll  就可以了. 接下来..................... ...

  8. FilterDispatcher已被标注为过时解决办法 &gt;&gt;&gt; FilterDispatcher &lt;&lt;&lt; is deprecated!

    一些struts2的教程都是比较早的,当我们基于较新版本的struts2来实现代码的时候,往往会出现一些问题.比如这个警告:FilterDispatcher isdeprecated! 在web.xm ...

  9. java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet

    一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet- ...

  10. GJM :SqlServer语言学习笔记

    ----------------------------SqlServer RDBMS 关系型数据库管理系统 Row/Record 行 Colimn/Attribute 列 Field/Cell 字段 ...