[C#6] 7-索引初始化器
0. 目录
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-索引初始化器的更多相关文章
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- Linq之隐式类型、自动属性、初始化器、匿名类
目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...
- C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
- .NET 中创建支持集合初始化器的类型
对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰.至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些. 本文将编写一个类型,可以使用集合初始化器构造这个类型.不只是添 ...
- C#_基础,初始化器
对象初始化器 在没有对象初始化器之前,我们创建一个对象大概需要经过这么两个步骤,首先new一个对象,然后给每个字段赋值.而有了对象初始化器之后,原本需要几行代码才能完成的任务变成一行代码就可以完成,简 ...
- 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...
- swift_初始化器的使用
//: Playground - noun: a place where people can play import Cocoa ***************************结构体与Cla ...
- Linq专题之集合初始化器
集合初始化器用来初始化一个集合,和对象初始化器有点类似,都是用一对{}来初始化. using System; using System.Collections.Generic; using Syste ...
- Linq专题之对象初始化器
在C#3.0之前,如果创建一个新的对象,往往需要调用类的构造函数来初始化该对象的值,在c#3.0提供了一个"对象初始化器"的机制,使得开发人员在创建新的对象时不通过调用类的构造函数 ...
随机推荐
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
- 用jekyll制作高大上的网站(一)——安装与配置
很多人会制作自己的主页,页面美观简洁,一直很在意是怎么做的. 最近公司需要做个文档库的主页,就研究了一些开源的工具,后面发现了jekyll(读杰克尔),将纯文本转换为静态博客网站. 一.Ruby je ...
- CSS3动画几个平时没注意的属性
一.timing-function: steps() 一开始在使用CSS3的时候并没有太注意这个timing-function,只是注意到自定义贝塞尔曲线. 1)一个项目中的实例 先来看看左边加了st ...
- CSS魔法堂:重拾Border之——不仅仅是圆角
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- WebSocket in ASP.NET Core
一.WebSocket WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0 ...
- C#测试题若干,都是基础阿
类的以下特性中,可以用于方便地重用已有的代码和数据的是( ). A.多态B.封装C.继承D.抽象 答案:http://hovertree.com/tiku/bjaf/a3k6pgq5.htm 可用 ...
- siteMap与站点导航
ASP.NET 站点导航主要由与站点地图数据源通信的站点地图提供程序以及公开站点地图提供程序的功能的类构成.ASP.NET 站点导航使您能够将到您所有页面的链接存储在一个中心位置,并通过包含一个用于读 ...
- 在Python应用中使用MongoDB
Python是开发社区中用于许多不同类型应用的强大编程语言.很多人都知道它是可以处理几乎任何任务的灵活语言.因此,在Python应用中需要一个什么样的与语言本身一样灵活的数据库呢?那就是NoSQL,比 ...
- 从零开始学Python第八周:网络编程基础(socket)
Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...
- IT基础架构规划方案之实际网络设计案例
根据某集团总部新办公大楼.厂房和分支机构(店面)的情况,以及IT部门对网络节点数.网络应用和分支机构(店面)的初步规划,对企业的总体网络拓扑结构进行设计,如下图. 设备选型和部署参考: 类型 设备选型 ...