C# 3.0语言新特性(语言规范):4 对象和集合初始化器
翻译:CSDN lover_P
一个对象创建表达式可以包含一个对象或集合初始化器,用于初始化新创建的对象的成员或新创建的集合的元素。
object-creation-expression:
new type ( argument-listopt ) object-or-collection-initializeropt
new type object-or-collection-initializer
object-or-collection-initializer:
object-initializer
collection-initializer
一个对象创建表达式可以省略构造器参数列表,并将其连同圆括号一起替换为一个对象或集合初始化器。省略构造器参数列表并将其连同圆括号一起替换为一个对象或集合初始化器等价于指定一个空的参数列表。
在执行一个带有对象或集合初始化器的对象创建表达式时,首先调用实例构造器,然后执行对象或集合初始化器指定的成员或元素初始化。
对象或集合初始化器不能引用正在初始化的对象实例。
4.1 对象初始化器
对象初始化器指定了对象的一个或多个域或属性的值。
object-initializer:
{ member-initializer-listopt }
{ member-initializer-list , }
member-initializer-list:
member-initializer
member-initializer-list , member-initializer
member-initializer:
identifier = initializer-value
initializer-value:
expression
object-or-collection-initializer
对象初始化器由一系列的成员初始化器构成,包围在{和}记号中,并用逗号进行分隔。每个成员初始化器以对象的一个可访问的域或属性的名字开始,后跟一个等号,之后是一个表达式或一个对象或集合初始化器。如果对象初始化其中包括了对同一个域或属性的多于一个的成员初始化器,将会发生错误。
在等号后面指定了表达式的成员初始化器的处理与域和属性的赋值一致。
在等号后面指定了对象初始化器的成员初始化器也是对一个嵌套对象的初始化。与为域或属性赋一个新值不同,对象初始化器中的赋值被视为对域或属性的成员进行赋值。一个具有值类型的属性不能通过这种构造来进行初始化。
在等号后面指定了集合初始化器的成员初始化器也是对一个嵌套集合的初始化。与为域或属性赋一个新的集合不同,初始化器中给定的元素将被添加到域或属性所引用的集合中。该域或属性必须是一个满足下一节所指定的需求的集合类型。
下面的类表是一个具有两个坐标值的点:
public class Point
{
int x, y;
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
Point的一个实例可以像下面这样创建和初始化:
var a = new Point { X = 0, Y = 1 };
其等价于:
var a = new Point();
a.X = 0;
a.Y = 1;
下面的类表是一个具有两个点的矩形:
public class Rectangle
{
Point p1, p2;
public Point P1 { get { return p1; } set { p1 = value; } }
public Point P2 { get { return p2; } set { p2 = value; } }
}
可以像下面这样创建和初始化一个Rectangle:
var r = new Rectangle {
P1 = new Point { X = 0, Y = 1 },
P2 = new Point { X = 2, Y = 3 }
};
其等价于:
var r = new Rectangle();
var __p1 = new Point();
__p1.X = 0;
__p1.Y = 1;
r.P1 = __p1;
var __p2 = new Point();
__p2.X = 2;
__p2.Y = 3;
r.P2 = __p2;
其中的__p1和__p2是临时变量,在其他地方不可见也不可访问。
如果Rectangle的构造器分配了两个嵌套的Point实例:
public class Rectangle
{
Point p1 = new Point();
Point p2 = new Point();
public Point P1 { get { return p1; } }
public Point P2 { get { return p2; } }
}
下面的构造可以用来初始化内嵌的Point实例,而不是为其赋以新值:
var r = new Rectangle {
P1 = { X = 0, Y = 1 },
P2 = { X = 2, Y = 3 }
};
其等价于:
var r = new Rectangle();
r.P1.X = 0;
r.P1.Y = 1;
r.P2.X = 2;
r.P2.Y = 3;
4.2 集合初始化器
集合初始化器指定了集合的元素。
collection-initializer:
{ element-initializer-listopt }
{ element-initializer-list , }
element-initializer-list:
element-initializer
element-initializer-list , element-initializer
element-initializer:
non-assignment-expression
一个集合初始化器由一系列的元素初始化器构成,包围在{和}记号之间,并使用逗号进行分隔。每个元素初始化器指定一个元素,该元素将被添加到待初始化的集合对象中。为了避免与成员初始化器混淆,元素初始化器不能是赋值表达式。
下面是包含了集合初始化器的对象创建表达式的一个例子:
List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
可以应用集合初始化器的对象的类型必须实现了System.Collections.Generic.ICollections<T>并指定了确定的T。此外,必须存在从每个元素初始化器的类型到T的隐式转换。如果这些条件不能满足,就会产生一个编译期错误。集合初始化器将依次对每个指定的元素调用ICollection<T>.Add(T)。
下面的类表是一个具有一个名字和一组电话号码的通讯录:
public class Contact
{
string name;
List<string> phoneNumbers = new List<string>();
public string Name { get { return name; } set { name = value; } }
public List<string> PhoneNumbers { get { return phoneNumbers; } }
}
可以像下面这样创建和初始化一个List<Contact>:
var contacts = new List<Contact> {
new Contact {
Name = "Chris Smith",
PhoneNumbers = { "206-555-0101", "425-882-8080" }
},
new Contact {
Name = "Bob Harris",
PhoneNumbers = { "650-555-0199" }
}
};
其等价于:
var contacts = new List<Contact>();
var __c1 = new Contact();
__c1.Name = "Chris Smith";
__c1.PhoneNumbers.Add("206-555-0101");
__c1.PhoneNumbers.Add("425-882-8080");
contacts.Add(__c1);
var __c2 = new Contact();
__c2.Name = "Bob Harris";
__c2.PhoneNumbers.Add("650-555-0199");
contacts.Add(__c2);
其中__c1和__c2是临时变量,在其他地方不可见且不可访问。
转载于:https://www.cnblogs.com/rookieport/archive/2005/09/27/244801.html
C# 3.0语言新特性(语言规范):4 对象和集合初始化器相关推荐
- 高性能数据库引擎 CoolHash 产品宣言 Fourinone4.0版新特性(转)
Fourinone4.0版新特性:一个高性能的数据库引擎CoolHash(酷哈嘻) 一.前言:如何写一个数据库 如果将操作系统和业务应用之间的软件都统称中间件的话,那么最重要的软件无疑是数据库,它比w ...
- Tensorflow 2.0的新特性
Tensorflow 2.0的新特性 几天前,Tensorflow刚度过自己的3岁生日,作为当前最受欢迎的机器学习框架,Tensorflow在这个宝座上已经盘踞了近三年.无论是成熟的Keras,还是风 ...
- java 7.0 特性_JDK7.0语法新特性
JDK7.0语法新特性 1,菱形语法(泛型实例化类型自动推断) List list = new ArrayList<>(); // <>这个真的很像菱形 2,在目前版本中,不可 ...
- C# 8.0 的新特性概览和讲解
本文转自 https://blog.csdn.net/hez2010/article/details/84036742 C# 8.0 的新特性概览和讲解 前言 新的改变 可空引用类型(Nullable ...
- php7.0的新特性
今天没事,看了看php的文档,记录php7.0的新特性,或者是自己以前不注意的细节: 1.3元运算符 $a有定义,正常写法 $a = 'dongxuemin'; $b = $a ? $a : '董学敏 ...
- Android O(SDK 8.0)新特性,刘海屏
> Android刘海屏 Android 屏幕,16:9,17:9,19:10,18:9,18.5:9所谓全面屏.挖孔屏.凹凸屏等. android 全面屏/刘海屏有效适配- https://b ...
- .NET 4.0 Interop新特性ICustomQueryInterface (转载)
.NET 4.0 Interop新特性ICustomQueryInterface 在.NET Framework v4.0发布的新功能中,在名字空间System.Runtime.InteropServ ...
- .NET Framework 4.0的新特性
本文将揭示.NET 4.0中的3个新特性:图表控件.SEO支持以及ASP.NET 4可扩展的输出缓存. 图表控件 微软向开发者提供了大量可免费下载的图表控件,可以在.NET 3.5 ASP.NET或W ...
- mysql 5.0 php_PHP 5.0的新特性
PHP 5.0的新特性 最近,读者可以从PHP 4.x版本转移到PHP 5.0版本.正如读者期望的那样,在一个新的主要版本中,它做出了一些重要变更.在这个版本中,PHP后台的Zend引擎经过了完全的重 ...
- 盘点Greenplum 6.0六大新特性及展望
导读:本文介绍Greenplum 6.0的新特性. 作者:王春波 来源:大数据DT(ID:hzdashuju) Greenplum 6.0于2019年9月4日正式发布,内核版本从PostgreSQL ...
最新文章
- SDN的实现思路—Vecloud微云
- 树莓派局域网文件共享samba
- 为MFC中的ListBox添加水平滚动条
- java获取classpath以外的路径
- 安装开源 ITIL 门户 iTOP
- 2021-2025年中国丁基胶粘剂行业市场供需与战略研究报告
- 纪念学海生涯的最后一次盲审抽签
- 深入解读Linux进程调度系列(6)——抢占与非抢占
- 如何查看手机里的.db数据库文件
- 计算机应用专业,报软考应该选什么?
- Android移动端性能测试工具mobileperf
- manul_css.css:1 Failed to load resource: the server responded with a status of 404 ()
- python神奇的小海龟_Python绘图——认识turtle小海龟
- GTK开发(二)控件和布局
- 中华名将索引 - 第一批:孙武
- 【python柱状图】图例大小、位置,X轴刻度大小,旋转角度
- 将图片转化为数据储存
- 最新『资源分享』IT视频教程
- Ubuntu系统yolov5训练报错集合
- 什么是数据产品,怎么设计一个好用的数据产品
热门文章
- MySQL 计算字段长度函数LENGTH()与CHAR_LENGTH()
- VS2015 包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解
- eureka默认端口号是多少_微服务技术系列教程 - SpringCloud- 服务治理Eureka(集群搭建)...
- 华为智慧屏 鸿蒙如何获得,荣耀智慧屏得鸿蒙助力,玩法超多
- 剑指 Offer 07. 重建二叉树(day02)
- javaWeb中的分页处理思想
- ubuntu mysql 内存满了_Ubuntu 下 mysql 卸载后重安装时遇到的问题
- Cesium:解决画线不光滑,模糊不清,锯齿状
- 大整数相乘python fft_Python带你理解用于信号同步的CAZAC序列
- java 调用tomcat api,tomcat处理http请求-下