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. 1Z0-053 争议题目解析24

    1Z0-053 争议题目解析24 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 24.Which of the following information will be gath ...

  2. JS代码实现的聊天框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. phpStorm入门

    首先在官网上下载并安装:http://www.jetbrains.com/phpstorm/; 安装成功后需要激活: IntelliJ IDEA开源社区 提供了如下通用激活方法: 注册时选择Licen ...

  4. Microsoft Azure News(6) Azure新F系列虚拟机

    <Windows Azure Platform 系列文章目录> 我们知道Azure虚拟机的CPU和内存是固定搭配的,不可以按照用户的想法随意更改. 在有些时候,我们需要虚拟机CPU核心数量 ...

  5. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  6. 分离的思想结合单链表实现级联组件:CascadeView

    本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...

  7. C++ this指针的用法

    this指针的含义及其用法: 1. this指针是一个隐含于每一个成员函数中的特殊指针.它指向正在被该成员函数操作的那个对象.2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针, ...

  8. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

  9. UIAlertController 部分用法及属性

    //创建UIAlertController:初始化UIAlertController 需要使用alertControllerWithTitle UIAlertController *alertCont ...

  10. ASP.NET 5 已死 - 隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0

    还没正式登场就死了?不能怪我标题党,是大神Scott在他博客上这么说的,我只是翻译了一下. 在1月20号最新的ASP.NET Community Standup视频中,微软aspnet开发组的大帅哥 ...