您的位置:首页 > 编程语言 > C#

C#2008语言特征6----匿名类型

2009-03-21 12:43 218 查看
前面已经讲过匿名方法,在c#3.0中将匿名向前推进了一步,现在连类型也可以匿名了。
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需显式定义一个这个对象的类型。类型名由编译器生成,并且不能在源代码级使用。这些属性的类型由编译器推断。
匿名类型是使用 new 运算符和对象初始值设定项创建的。匿名类型是由一个或多个公共只读属性组成的类类型。不允许包含其他种类的类成员(如方法或事件)。匿名类型不能强制转换为除 object 以外的任何接口或类型。在将匿名类型分配给变量时,必须使用 var 构造初始化该变量。这是因为只有编译器能够访问匿名类型的基础名称。
根据以上的规则,看示例AnonymousType,示例中有下面的代码
namespace AnonymousType
{
class Program
{
static void Main(string[] args)
{

var anonymousType1 = new
{
CardNumber = "10001",
Name = "van's",
Sex = true
};

Console.WriteLine(anonymousType1.CardNumber);
Console.WriteLine(anonymousType1.Name);
var anonymousType2 = new
{
CardNumber = "10002",
Name = "martin",
Sex = true
};
Console.WriteLine(anonymousType2.CardNumber);
Console.WriteLine(anonymousType2.Name);
anonymousType2 = anonymousType1;
Console.WriteLine(anonymousType2.CardNumber);
Console.WriteLine(anonymousType2.Name);
Console.ReadKey();

}
}
}
在上面代码的方框部分,使用new运算符生成了一个匿名的对象,对象有三个属性,分别是CardNumber、Name、Sex这个匿名的对象虽然对于编译器有一个名称,但是在代码中不能使用,只能使用var来构造与初始化这个对象。
匿名类型是直接从对象派生的引用类型。尽管应用程序无法访问匿名类型,但编译器仍会为其提供一个名称。从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有什么不同,唯一区别在于匿名类型无法强制转换为除object以外的任何类型。
如果两个或更多个匿名类型以相同的顺序具有相同数量和种类的属性,则编译器会将这些匿名类型视为相同的类型,并且它们共享编译器生成的相同类型信息。根据这个规则,可以生成一个隐式类型化数组,隐式类型化数组是隐式类型化局部变量的延伸。看下面的代码:
class AnonymousTypeArray : AppRunner.AbstractApplication
{
public override void Run()
{
var intArray = new[] { 1, 2, 3, 4, 5 };
var doubleArray = new[] { 3.14, 1.414 };
var anonymousTypeArray = new[] {
new { Name="van's", Sex=false, Arg=22 },
new { Name="martin", Sex=true, Arg=23 }
};
Console.WriteLine(intArray);
Console.WriteLine(doubleArray);
Console.WriteLine(anonymousTypeArray[0].Name);
}
}
在上面的代码中,变量anonymousTypeArray是由2个匿名类型的两个对象组成的数组,由于每个匿名类型对象具有相同的数量与类型的属性,所以这两个匿名类型的对象被作为同一个匿名类型的对象,然后组成数组,因为不知道具体对象属于哪个具体的类型,因此只能使用var类型来初始化这个数组的类型。
匿名类型的适用范围是在程序运行期间需要临时存储的一些中间结果,这些中间结果一般不需要传递或者存储。因为匿名类型具有方法范围。若要向方法边界外部传递一个匿名类型或一个包含匿名类型的集合,必须首先将匿名类型强制转换为对象。但是,这会使匿名类型的强类型化无效。如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: