C#中的那些额外花括号是什么作用?

9

很抱歉我不知道如何搜索这个问题,如果这已经是重复的请原谅。

所以,我有一些像这样的代码:

textBox1.InputScope = new InputScope { Names = { _Scope } };

Names属性的类型是IList

我的代码是向列表添加项目还是创建新列表?

那个额外的花括号是干什么用的?

4个回答

15

这是一个集合初始化器,但它并不会创建一个新的集合 - 它只是向现有集合中添加元素。它被用作成员初始化器中的初始化值部分,用于对象初始化器中。这相当于:

InputScope tmp = new InputScope();
tmp.Names.Add(_Scope);
textBox1.InputScope = tmp;

请参见C# 4规范第7.6.10.3节获取更多信息。


这是不是类似于Java中的双括号技巧,但没有匿名类的可怕影响? - G_H
2
@G_H:有点儿……用C#直接讲它的实际功能比讲如何在Java中模拟它要容易些 :) - Jon Skeet
@JerryNixon:集合初始化程序只能作为对象创建表达式的一部分出现。不过,您仍然可以执行“_List = new List<int> { 1, 2, 3 }”。 - Jon Skeet
@Jon,希望不算太离题。对于可枚举对象,是否有一种添加多个元素的语法,类似于上面的语法?例如_List.AddRange({ 4, 5, 6});?我完全理解为什么它不起作用。但是有没有类似的东西呢? - Jerry Nixon
@JerryNixon:不,恐怕不行。 - Jon Skeet
显示剩余2条评论

11

7
new InputScope { // indicates an object-initializer for InputScope using
                 // the default constructor
   Names = { // indicates an in-place usage of a collection-initializer
     _Scope  // adds _Scope to Names
   } // ends the collection-initializer
}; // ends the object-initializer

即。
var tmp = new InputScope();
tmp.Names.Add(_Scope);
textBox1.InputScope = tmp;

2

第一个花括号集是对象初始化器。第二个集合是名称列表的IList


已编辑以符合文档 - 数组和集合(这里是IList)都支持相同的对象初始化方式。我原以为它是一个数组。感谢澄清! - SliverNinja - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接