C#匿名类型

我们会花费很多的时间为数据表示创建一些简单的类,尤其是在数据库应用程序中。经常会有一系列的类只提供属性。这些类什么也没做,只是存储结构化数据。
匿名类型(anonymous type)是简化这种编程模型的一种方式。其原理是使用C#编译器根据要存储的数据自动创建类型,而不是定义简单的数据存储类型。
例如:

var student = new {
     name = "amvincible",
     country = "China",
     sex = "male",
     hobby = "female",
     age = 21
};
  • 这里使用了var关键字,因为匿名类型没有可以使用的标识(zhi)符,其实它内部是有的,但是在代码中不能使用。
  • 在**new **关键字后没有指定类型名称,这是编译器确定我们在使用匿名类型的方式。

IDE在检测到匿名类型定义后,会更新ItelliSense 智能感知 ,可以看到如图所示的匿名类型。

C#匿名类型_第1张图片
匿名类型智能感知.png

其中student的类型是'a。显然,不能再代码中使用这个类型,也不是一个合法的标识符。' 符号用于智能感知中表示匿名类型,智能感知还能查看匿名类型的成员。

C#匿名类型_第2张图片
类型成员.png

注意,属性的定义是只读类型。这表示,如果要在数据存储对象中修改属性的值,就不能使用匿名类型。如图所示。

C#匿名类型_第3张图片
属性只读.png

示例代码

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#入门经典 (第六版)》

你可能感兴趣的:(C#匿名类型)