仅含get访问器的HttpRequestMessage.Headers如何用集合初始化语法?
问题解答
1. 这种语法是什么?
这是C#里的集合初始化器语法糖,属于「对象初始化器中对已有集合的初始化」,不是创建新集合对象。
你看到的Headers = { { ... }, { ... } },本质上不是给Headers属性赋值(毕竟它只有get访问器,确实不能直接赋值),而是编译器帮你做了两件事:
- 调用
request.Headers的getter,拿到已存在的HttpRequestHeaders实例(你的源码里能看到,第一次访问时会懒加载创建HttpRequestHeaders对象) - 对这个实例多次调用
Add方法,每个{ key, value }对应一次Add(key, value)调用
2. 为什么只读属性能这么用?
因为你根本没给Headers属性赋值——你只是通过属性的getter拿到它返回的集合对象,然后对这个对象进行操作。只要这个集合对象是可变的(比如提供了Add方法),就能用这种初始化器语法来批量添加元素。
3. 等价的展开代码
编译器会把你写的代码转换成下面这样:
var request = new HttpRequestMessage(); // 先获取Headers实例(懒加载创建) var headersCollection = request.Headers; // 调用Add方法添加头 headersCollection.Add(HttpRequestHeader.Authorization.ToString(), Token); headersCollection.Add(HttpRequestHeader.ContentType.ToString(), "multipart/form-data"); // 其他属性赋值 request.Method = HttpMethod.Post; request.RequestUri = new Uri(endpointUrl); request.Content = content;
补充:关于嵌套花括号的写法
这种{ { key, value } }的格式,是因为HttpRequestHeaders提供了接受两个参数的Add(string name, string value)方法。C#集合初始化器支持匹配多参数的Add方法,用嵌套花括号来传递多个参数。如果是单参数的Add,直接写{ 元素 }就行。
内容的提问来源于stack exchange,提问作者Mario Š.
相关产品推荐
相关产品推荐

