日期:2011-04-27  浏览次数:20448 次

原文:《C# Version 3.0 Specification》,Microsoft
翻译: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;

 

    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是临时变量,在其他地方不可见也不可访问。