嵌套类型
在类或结构内部定义的类型称为嵌套类型。例如:
class Container
{
class Nested
{
Nested() { }
}
}
不管外部类型是类还是结构,嵌套类型均默认为 private,但是可以设置为 public、protected internal、protected、internal 或 private。在上面的示例中,Nested 对外部类型是不可访问的,但可以设置为 public,如下所示:
class Container
{
public class Nested
{
Nested() { }
}
}
嵌套类型(或内部类型)可访问包含类型(或外部类型)。若要访问包含类型,请将其作为构造函数传递给嵌套类型。例如:
public class Container
{
public class Nested
{
private Container parent;
public Nested()
{
}
public Nested(Container parent)
{
this.parent = parent;
}
}
}
嵌套类型可以访问其包含类型可以访问的所有成员。它可以访问包含类型的私有成员和受保护成员(包括所有继承的受保护成员)。
在前面的声明中,类 Nested 的完整名称为 Container.Nested。这是用来创建嵌套类新实例的名称,如下所示:
Container.Nested nest = new Container.Nested();
匿名类型
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。
可通过使用 new 运算符和对象初始值创建匿名类型。
以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型。
var v = new { Amount = 108, Message = "Hello" };
// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);
匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。
匿名类型包含一个或多个公共只读属性。包含其他种类的类成员(如方法或事件)为无效。用来初始化属性的表达式不能为 null、匿名函数或指针类型。
最常见的方案是用其他类型的属性初始化匿名类型。在下面的示例中,假定名为 Product 的类存在。类 Product 包括 Color 和 Price 属性,以及你不感兴趣的其他属性。变量 products 是 Product 对象的集合。匿名类型声明以 new 关键字开始。声明初始化了一个只使用 Product 的两个属性的新类型。这将导致在查询中返回较少数量的数据。










