读C# Language Specification 1.2 CN.doc 心得(1)
Posted on 2006-03-10 16:20 Snapping 阅读(496) 评论(3) 编辑 收藏 举报
1.结构的成员若是在此结构中声明的(也就是说,不是由该结构从它的基类中继承的),则不能具有 protected 或 protected internal 已声明可访问性
2. Boxing
struct Point
{
public int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
则下面的语句
Point p = new Point(10, 10);
object box = p;
p.x = 20;
Console.Write(((Point)box).x);
![](/Images/OutliningIndicators/None.gif)
上述例子上接过该为10. 因为将 p 赋值给 box 是一个隐式装箱操作,它将复制 p 的值。装箱转换隐含着复制一份待装箱的值。这不同于从 reference-type 到 object 类型的转换,在后一种转换中,转换后的值继续引用同一实例,只是将它当作派生程度较小的 object 类型而已。
如果将 Point 声明为 class,由于 p 和 box 将引用同一个实例,因此输出值为 20。
3.Unboxing
一个拆箱操作包括以下两个步骤:首先检查对象实例是否为给定 value-type 的一个装了箱的值,然后将该值从实例中复制出来。结构可以从类型 System.ValueType 进行拆箱.
装箱操作会把相关的结构值复制为已被装箱的实例,而拆箱则会从已被装箱的实例中复制出一个结构值。因此,在装箱或拆箱操作后,对“箱”外的结构进行的更改不会影响已被装箱的结构
4. this:
在类的实例构造函数和实例函数成员中,this 为值类别.因此,虽然 this 可以用于引用该函数成员调用所涉及的实例,但是不可能在类的函数成员中对 this 本身赋值;
在结构的实例构造函数内,this 相当于一个结构类型的 out 参数,而在结构的实例函数成员内,this 相当于一个结构类型的 ref 参数。在这两种情况下,this 本身相当于一个变量,因而有可能对该函数成员调用所涉及的整个结构进行修改(如对 this 赋值,或者将 this 作为 ref 或 out 参数传递)。
5.结构:
结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。
struct Point
{
public int x = 1; // Error, initializer not permitted
public int y = 1; // Error, initializer not permitted
}
结构不允许声明无参数实例构造函数。相反,每个结构隐式地具有一个无参数实例构造函数,该构造函数始终返回相同的值,即通过将所有的值类型字段设置为它们的默认值,并将所有引用类型字段设置为 null 而得到的值。结构可以声明具有参数的实例构造函数。
如果该结构实例构造函数没有指定构造函数初始值设定项,则 this 变量就相当于一个结构类型的 out 参数,并且,与 out 参数类似,this 必须在该构造函数返回的每个位置上明确赋值。如果该结构实例构造函数指定了构造函数初始值设定项,则 this 变量就相当于结构类型的 ref 参数,并且,与 ref 参数类似,this 被视为在进入构造函数体时已被明确赋值。在被构造的结构的所有字段已明确赋值以前,不能调用任何实例成员函数(包括属性的 set 访问器)
在被构造的结构的所有字段已明确赋值以前,不能调用任何实例成员函数(包括属性的 set 访问器)
在结构类型中不允许声明析构函数。
2. Boxing
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
上述例子上接过该为10. 因为将 p 赋值给 box 是一个隐式装箱操作,它将复制 p 的值。装箱转换隐含着复制一份待装箱的值。这不同于从 reference-type 到 object 类型的转换,在后一种转换中,转换后的值继续引用同一实例,只是将它当作派生程度较小的 object 类型而已。
如果将 Point 声明为 class,由于 p 和 box 将引用同一个实例,因此输出值为 20。
3.Unboxing
一个拆箱操作包括以下两个步骤:首先检查对象实例是否为给定 value-type 的一个装了箱的值,然后将该值从实例中复制出来。结构可以从类型 System.ValueType 进行拆箱.
装箱操作会把相关的结构值复制为已被装箱的实例,而拆箱则会从已被装箱的实例中复制出一个结构值。因此,在装箱或拆箱操作后,对“箱”外的结构进行的更改不会影响已被装箱的结构
4. this:
在类的实例构造函数和实例函数成员中,this 为值类别.因此,虽然 this 可以用于引用该函数成员调用所涉及的实例,但是不可能在类的函数成员中对 this 本身赋值;
在结构的实例构造函数内,this 相当于一个结构类型的 out 参数,而在结构的实例函数成员内,this 相当于一个结构类型的 ref 参数。在这两种情况下,this 本身相当于一个变量,因而有可能对该函数成员调用所涉及的整个结构进行修改(如对 this 赋值,或者将 this 作为 ref 或 out 参数传递)。
5.结构:
结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
如果该结构实例构造函数没有指定构造函数初始值设定项,则 this 变量就相当于一个结构类型的 out 参数,并且,与 out 参数类似,this 必须在该构造函数返回的每个位置上明确赋值。如果该结构实例构造函数指定了构造函数初始值设定项,则 this 变量就相当于结构类型的 ref 参数,并且,与 ref 参数类似,this 被视为在进入构造函数体时已被明确赋值。在被构造的结构的所有字段已明确赋值以前,不能调用任何实例成员函数(包括属性的 set 访问器)
在被构造的结构的所有字段已明确赋值以前,不能调用任何实例成员函数(包括属性的 set 访问器)
在结构类型中不允许声明析构函数。
应用程序域中第一次发生以下事件时将触发结构的静态构造函数的执行:结构的实例成员被引用。结构的静态成员被引用。结构的显式声明的构造函数被调用。