匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。
匿名类型是使用 new 运算符和对象初始值设定项创建的。
匿名类型是由一个或多个公共只读属性组成的类类型。不允许包含其他种类的类成员(如方法或事件)。
最常见的方案是用其他类型的一些属性初始化匿名类型。
如果您没有在匿名类型中指定成员名称,编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。必须为使用表达式初始化的属性提供名称。
在将匿名类型分配给变量时,必须使用 var 构造初始化该变量。这是因为只有编译器能够访问匿名类型的基础名称。
匿名类型是直接从对象派生的引用类型。尽管应用程序无法访问匿名类型,但编译器仍会为其提供一个名称。从公共语言运行库的角度来看,匿名类型与任何其他引用类型没有什么不同。
如果两个或更多个匿名类型以相同的顺序具有相同数量和种类的属性,则编译器会将这些匿名类型视为相同的类型,并且它们共享编译器生成的相同类型信息。
匿名类型具有方法范围。若要向方法边界外部传递一个匿名类型或一个包含匿名类型的集合,必须首先将匿名类型强制转换为对象。但是,这会使匿名类型的强类型化无效。如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。
匿名类型不能像属性一样包含不安全类型。
由于匿名类型上的 Equals 和 GetHashCode 方法是根据属性的 Equals 和 GetHashcode 定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。
/// <summary>
/// 匿名类型
/// </summary>
class CSharp30_Demo3
{
/*
/// <summary>
/// 错误。因为var只能出现在局部区域内。
/// </summary>
var anonymousType_1 = new
{
Name = "Peter",
Age = 1,
Sex = "Unknow"
};
*/
public static void Show()
{
var anonymousType_2 = new
{
Name = "Jie",
Age = 23
};
var anonymousType_3 = new
{
Name = "Jack",
Sex = "Unknow"
};
var anonymousType_4 = new
{
Name = "Nancy",
Age = 22
};
Console.WriteLine("CS3.0 - 匿名类型 (Anonymous types){0}{1}",
Environment.NewLine, "——————————————————————————————");
Console.WriteLine("anonymousType_2's type:{1}{0}anonymousType_2.Name:{2}{0}anonymousType_2.Age:{3}{0}",
Environment.NewLine, anonymousType_2.GetType(),anonymousType_2.Name,anonymousType_2.Age);
//匿名类型是否能复制是根据其内在的属性字段来判断的
anonymousType_2 = anonymousType_4;//right
//anonymousType_2 = anonymousType_3;//error
Console.WriteLine("anonymousType_2's type:{1}{0}anonymousType_2.Name:{2}{0}anonymousType_2.Age:{3}{0}",
Environment.NewLine, anonymousType_2.GetType(), anonymousType_2.Name, anonymousType_2.Age);
}
}