C#3.0语言新特性之对象和集合初始化器

在C#3.0中,一个对象创建表达式可以包含一个对象或集合初始化器,用于初 始化新创建的对象的成员或新创建的集合的元素。

对象创建表达式:

new type (argument-list(可选)) 对象或集合初试化器(可选)

new type 对象或集合初试化器

一个对象创建表达式可以省略构造器参数列表,并将其连同圆括号一起替换 为一个对象或集合初始化器。省略构造器参数列表并将其连同圆括号一起替换为 一个对象或集合初始化器等价于指定一个空的参数列表。

在执行一个带有对象或集合初始化器的对象创建表达式时,首先调用实例构 造器,然后执行对象或集合初始化器指定的成员或元素初始化。对象或集合初始 化器不能引用正在初始化的对象实例。

20.4.1 引入对象初始器

在传统的C#中,我们常用两种方法来对一个类(或者结构体)进行初始化, 一是采用带有参数的构造函数,另一种则是不采用构造函数,或者构造函数中并 没有实际地对字段进行赋值,而是在申请了类的实例之后,手动对它的公共属性 进行赋值。下面是一个二维空间的几何点例子:

public class Point

    {

        private int xPos, yPos;

        //缺省的构造函数

        public Point()

        {

        }

        public Point(int x, int y)

        {

            xPos = x;

            yPos = y;

        }

        public int X

        {

            get { return xPos; }

            set { xPos = value; }

        }

        public int Y

        {

            get { return yPos; }

            set { yPos = value; }

        }

        public override string ToString()

        {

            return string.Format("[{0}, {1}]", xPos, yPos);

        }

    }

对于这个类,按照一般方法,我们会这样来初始化它:

//调用自定义的构造函数

Point p = new Point(100,200);

  //或者手动指定每个属性

  Point p1 = new Point();

  p1.X = 100;

  p1.Y = 200;

现在我们采用类初始化器的C# 3.0代码则可以写成下面的样子:

var p1 = new Point { X = 100, Y = 200 };

Point p = new Point { X = 100, Y = 200 };

其中第一个是隐式类型变量。这里并没有显式调用Point的构造函数,仅仅是 将值设给了公共的X和Y属性。在这里,类型的缺省构造函数被调用,紧跟着将值 赋给指定的属性。从这一点上说,最后这两个实例实际上就是第一个实例的简化 写法。

从上面的例子中,我们可以看出:

l 对象初始化器由一系列的成员初始化器构成,包围在{和}记号中,并用逗 号进行分隔。每个成员初始化器以对象的一个可访问的域或属性的名字开始,后 跟一个等号,之后是一个表达式或一个对象或集合初始化器。如果对象初始化其 中包括了对同一个域或属性的多于一个的成员初始化器,将会发生错误。

l 在等号后面指定了表达式的成员初始化器的处理与域和属性的赋值一致。

l 在等号后面指定了对象初始化器的成员初始化器也是对一个嵌套对象的初 始化。与为域或属性赋一个新值不同,对象初始化器中的赋值被视为对域或属性 的成员进行赋值。一个具有值类型的属性不能通过这种构造来进行初始化。

l 在等号后面指定了集合初始化器的成员初始化器也是对一个嵌套集合的初 始化。与为域或属性赋一个新的集合不同,初始化器中给定的元素将被添加到域 或属性所引用的集合中。该域或属性必须是一个满足下一节所指定的需求的集合 类型。

l 对象初时化器是利用了编译器对对象中的对外可见的字段或属性进行按序 赋值,在编译还是隐式调用了构造函数,对字段或属性的赋值可以是一个或是多 个。

时间: 2024-12-01 18:37:30

C#3.0语言新特性之对象和集合初始化器的相关文章

C# 3.0语言新特性(语言规范):4 对象和集合初始化器

对象|规范|集合 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P 一个对象创建表达式可以包含一个对象或集合初始化器,用于初始化新创建的对象的成员或新创建的集合的元素. object-creation-expression:new  type  (  argument-listopt  )  object-or-collection-initializeroptnew  type  object-or-collection-initia

C# 3.0语言新特性(语言规范):1 具有隐式类型的局部变量

变量|规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P 在一个具有隐式类型的局部变量声明(implicitly typed local variable declaration)中,被声明的局部变量的类型是通过初始化该变量的表达式推断出来的.当使用局部变量声指示符符var来代替类型,并且当前作用域内没有名为var的类型时,这个声明便成为一个具有隐式类型的局部变量声明.例如: var i = 5; var s = "Hel

C#3.0语言新特性之隐式类型

20.1 隐式类型 在C#3.0中增加了一个变量声明var,这个声明和JavaScript 的var类似,但 也有不同.相同之处是它可以用var来声明任何类型的局部变量:而不同之处在 于它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而 且只能是局部变量. 20.1.1 隐式类型局部变量的声明与使用 在C# 3.0中,引进了一个新的关键字叫做var.var允许你声明一个新变量, 它的类型是从用来初始化器变量的表达式里隐式的推断出来的,即在声明时,你 不需要给它定义类型,它会根据

C# 3.0语言新特性(语言规范):7 查询表达式

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P 查询表达式(Query Expression)为查询提供了一种语言集成的语法,这种语法类似于关系和分级查询语言,如SQL和XQuery. query-expression:from-clause  query-body from-clause:from  from-generators from-generators:from-generatorfrom-generators  ,

C# 3.0语言新特性(语言规范)

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P C# 3.0(C# Orcas--魔鬼)在C# 2.0的基础上引入了很多语言扩展,用以支持高级别的函数式风格类库的创建和使用.这些扩展使得结构性API构造具有与其他领域(如关系数据库和XML)中查询语言同等的表达能力.这些扩展包括: 具有隐式类型的局部变量,允许通过用于初始化的表达式来推断局部变量的类型. 扩展方法,使得对一个现存类型的扩展和构造具有附加方法的类型变为现实. 拉姆达

C# 3.0语言新特性(语言规范):5 匿名类型

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P C# 3.0允许将new运算符用于一个匿名对象初始化器来创建一个匿名类型的对象. primary-no-array-creation-expression:...anonymous-object-creation-expression anonymous-object-creation-expression:new  anonymous-object-initializer ano

C# 3.0语言新特性(语言规范):6 具有隐式类型的数组

规范|数组 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P 数组创建表达式的语法被扩展为支持具有隐式类型的数组创建表达式: array-creation-expression:...new  [  ]  array-initializer 在一个具有隐式类型的数组创建表达式中,数组实例的类型通过数组初始化器中指定的元素来推断.特别地,数组初始化器中的表达式类型形成的集合中,必须恰好有一个类型使得其他类型都可以隐式地转换为该类型,并且该

C# 3.0语言新特性(语言规范):3 拉姆达表达式

规范 原文:<C# Version 3.0 Specification>,Microsoft翻译:lover_P C# 2.0中引入了匿名方法,允许在期望出现委托的时候以"内联(in-line)"的代码替代之.尽管匿名方法提供了函数式编程语言中的很多表达能力,但匿名方法的语法实在是太罗嗦了,并且很不自然.拉姆达表达式(Lambda expressions)为书写匿名方法提供了一种更加简单.更加函数化的语法. 拉姆达表达式的书写方式是一个参数列表后跟=>记号,然后跟一个

C#3.0语言新特性之匿名变量

20.2.1 引入匿名变量 在很多情况下,我们需要一种能够临时将一批具有一定关联的数据存放起来 的对象:或者在某些情况下,我们对仅一个对象的"形状"(如属性的名字和类 型等)比较感兴趣.例如Book类,当它和其他商品放在一起进行查询时,我们可 能仅对其名称和价格感兴趣,并且希望将这两种属性放在另外一个单独的临时对 象中以备今后使用.这时,我们关注的仅仅是这个临时对象具有Name和Price的 属性感兴趣,至于它究竟是什么类型就无关紧要了.然而,为了使这样一个对象 得以存在,我们不得不为