c# - 在字典初始化程序中使用方括号和花括号有区别吗?
问题描述
在字典初始化器中,有两种方法可以创建包含内容的字典:
new Dictionary<string, GradientSpace>
{
["userSpaceOnUse"] = GradientSpace.Absolute,
["objectBoundingBox"] = GradientSpace.Relative
})
和
new Dictionary<string, GradientSpace>
{
{"userSpaceOnUse", GradientSpace.Absolute},
{"objectBoundingBox", GradientSpace.Relative}
});
这两种语法有什么区别,还是只是偏好问题?
解决方案
当源如下,目标框架为 .NET 4.7.1 时:
var x = new Dictionary<string, int>
{
["userSpaceOnUse"] = 1,
["objectBoundingBox"] = 3
};
var y = new Dictionary<string, int> {
{"userSpaceOnUse", 1},
{"objectBoundingBox", 3}
};
这会产生以下中间语言(使用 JetBrains dotPeek):
// [18 13 - 22 15]
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::.ctor()
IL_0006: dup
IL_0007: ldstr "userSpaceOnUse"
IL_000c: ldc.i4.1
IL_000d: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::set_Item(!0/*string*/, !1/*int32*/)
IL_0012: nop
IL_0013: dup
IL_0014: ldstr "objectBoundingBox"
IL_0019: ldc.i4.3
IL_001a: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::set_Item(!0/*string*/, !1/*int32*/)
IL_001f: nop
IL_0020: stloc.0 // x
// [25 13 - 28 15]
IL_0021: newobj instance void class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::.ctor()
IL_0026: dup
IL_0027: ldstr "userSpaceOnUse"
IL_002c: ldc.i4.1
IL_002d: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::Add(!0/*string*/, !1/*int32*/)
IL_0032: nop
IL_0033: dup
IL_0034: ldstr "objectBoundingBox"
IL_0039: ldc.i4.3
IL_003a: callvirt instance void class [mscorlib]System.Collections.Generic.Dictionary`2<string, int32>::Add(!0/*string*/, !1/*int32*/)
IL_003f: nop
IL_0040: stloc.1 // y
第一种方式导致设置索引器/属性,而第二种方式使用 Add() 方法,这意味着它们的翻译方式不同。
Dictionary
在此上下文中查看该类
的 .NET Core 源代码也很有趣: https ://github.com/Microsoft/referencesource/blob/master/mscorlib/system/collections/generic/dictionary.cs
推荐阅读
- java - 复制到 vaadin 14 中的剪贴板组件
- javascript - 从选定的单选按钮显示输入文本框
- c - 编译“Hello World”程序时出错
- javascript - XMLHttp 请求上的混合内容
- java - JAVA使用匹配器/模式查找字符串中括号包围的部分
- html - 在同一行中的 div 中使用工具提示的 input 和 span 元素
- c++ - Visual Studio 2019 v16.3.9 是否完全支持 C++20?
- javascript - 如何比较两个数组项并替换,以及移动到特定位置
- angular - Ionic 3 sqlite 导出和导入数据库
- node.js - 如何使用 mongodb 聚合计算数组字段的百分比?