我们会花费很多的时间为数据表示创建一些简单的类,尤其是在数据库应用程序中。经常会有一系列的类只提供属性。这些类什么也没做,只是存储结构化数据。
匿名类型(anonymous type)是简化这种编程模型的一种方式。其原理是使用C#编译器根据要存储的数据自动创建类型,而不是定义简单的数据存储类型。
例如:
var student = new {
name = "amvincible",
country = "China",
sex = "male",
hobby = "female",
age = 21
};
- 这里使用了var关键字,因为匿名类型没有可以使用的标识(zhi)符,其实它内部是有的,但是在代码中不能使用。
- 在**new **关键字后没有指定类型名称,这是编译器确定我们在使用匿名类型的方式。
IDE在检测到匿名类型定义后,会更新ItelliSense 智能感知 ,可以看到如图所示的匿名类型。
其中student的类型是'a。显然,不能再代码中使用这个类型,也不是一个合法的标识符。' 符号用于智能感知中表示匿名类型,智能感知还能查看匿名类型的成员。
注意,属性的定义是只读类型。这表示,如果要在数据存储对象中修改属性的值,就不能使用匿名类型。如图所示。
示例代码
using System;
namespace demo
{
class Program
{
static void Main(string[] args)
{
var students = new[]
{
new
{
name = "amvincible",
country = "China",
sex = "male",
hobby = "female",
age = 21
},
new
{
name = "amvincible",
country = "China",
sex = "male",
hobby = "female",
age = 21
},
new
{
name = "amvincible",
country = "America",
sex = "male",
hobby = "female",
age = 25
},
};
Console.WriteLine(students[0].ToString());
Console.WriteLine(students[0].GetHashCode());
Console.WriteLine(students[1].GetHashCode());
Console.WriteLine(students[2].GetHashCode());
Console.WriteLine(students[0].Equals(students[1]));
Console.WriteLine(students[0].Equals(students[2]));
Console.WriteLine(students[0]==students[1]);
Console.WriteLine(students[0]==students[2]);
Console.ReadKey();
}
}
}
输出
{ name = amvincible, country = China, sex = male, hobby = female, age = 21 }
1324614728
1324614728
-157725995
True
False
False
False
示例说明
这个示例创建了一个匿名类型对象的数组,然后使用它测试匿名类型提供的成员。
- ToString()实现输出每个属性的值。
- 第五、六个输出使用Equals()方法,比较匿名类型对象的状态,如果一个对象的每个属性都和另一个对象对应的属性值相同,那么结果就是true。
- 使用==运算符比较对象引用,数组中的每一项都引用匿名类型的不同实例,结果是false。
完
[1] 本文部分内容来自《C#入门经典 (第六版)》