猿教程 Logo

C# 匿名类型

匿名类型,顾名思义,是一个没有任何名称的类型。 C#允许你使用new关键字创建一个对象,而不定义它的类。 隐式类型变量var用于保存匿名类型的引用。

相关实例:

static void Main(string[] args)
{
    var myAnonymousType = new { firstProperty = "First", 
                                secondProperty = 2, 
                                thirdProperty = true 
                              };
}

在上面的示例中,myAnonymousType是使用new关键字和对象初始化语法创建的匿名类型的对象。它包括不同数据类型的三个属性。

匿名类型是根据您在对象初始值设定中包含的数据推断的临时数据类型。 匿名类型的属性将是只读属性,因此您无法更改其值。

匿名类型在Visual Studio中具有智能感知支持:


请注意,编译器会根据值表达式对每个属性应用适当的类型。 例如,firstProperty是一个字符串类型,secondProperty是一个int类型,而thirdProperty是一个bool。

在内部,编译器自动为匿名类型生成新类型。 您可以检查匿名类型的类型,如下所示。

相关实例:

static void Main(string[] args)
{
    var myAnonymousType = new { firstProperty = "First", 
                                secondProperty = 2, 
                                thirdProperty = true 
                              };

    Console.WriteLine(myAnonymousType.GetType().ToString());

}

运行结果:

<>f__AnonymousType0'3[System.String,System.Int32,System.Boolean]

正如你在上面的输出中看到的,编译器生成一个带有匿名类型的隐藏名称的类型。 如果你在反射器中看到上面的匿名类型,它看起来像下面。



注意它是从System.Object类派生的。 此外,它是一个密封类,所有的属性都创建为只读属性。


嵌套匿名类型:

匿名类型可以有另一个匿名类型作为属性。

相关实例:

var myAnonymousType = new
                        {
                            firstProperty = "First",
                            secondProperty = 2,
                            thirdProperty = true,
                            anotherAnonymousType = new { nestedProperty = "Nested"}
                        };

嵌套的匿名类型也有智能感知支持。


匿名类型的范围:

匿名类型将始终位于定义它的方法的本地。 通常,你不能将匿名类型传递给另一个方法; 但是,您可以将其传递给接受动态类型的参数的方法。 请注意,不建议使用动态传递匿名类型。

相关实例:

static void Main(string[] args)
{

    var myAnonymousType = new
                            {
                                firstProperty = "First Property",
                                secondProperty = 2,
                                thirdProperty = true               
                            };

    DoSomethig(myAnonymousType);
}

static void DoSomethig(dynamic param)
{
    Console.WriteLine(param.firstProperty);
}

运行结果:

First Property

带有LINQ查询的匿名类型:

Linq Select子句创建一个匿名类型作为查询的结果,以包括未在任何类中定义的各种属性。 请考虑以下示例。

相关实例:

public class Student
{
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public int age { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        IList<Student> studentList = new List<Student>() { 
                        new Student() { StudentID = 1, StudentName = "John", age = 18 } ,
                        new Student() { StudentID = 2, StudentName = "Steve",  age = 21 } ,
                        new Student() { StudentID = 3, StudentName = "Bill",  age = 18 } ,
                        new Student() { StudentID = 4, StudentName = "Ram" , age = 20  } ,
                        new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } 
                    };

        var studentNames = from s in studentList
                           select new { StudentID = s.StudentID, 
                                        StudentName = s.StudentName 
                                      };

    }
}

在上面的例子中,Student类包括各种属性。 在Main()方法中,Linq select子句创建一个匿名类型,以仅包括StudentId和StudentName,而不包括结果中的所有属性。 因此,它在节省存储器和不必要的代码中是有用的。 查询结果集合仅包含StudentID和StudentName属性,如以下调试视图中所示。


要点
  1. 匿名类型可以使用new关键字和对象初始化语法来定义。 

  2. 隐式类型的变量var用于保存匿名类型。 

  3. 匿名类型是引用类型,所有属性都是只读的。 

  4. 匿名类型的范围是定义它的方法的局部范围。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CSharp/csharp-Anonymous-type.html