C#之匿名类型与隐式局部变量

一、匿名类型 

  下面一段代码展示了如何定义并且使用匿名类型:

static void Main(string[] args)
        {
            var patent1 = new 
            { Title = "Net Management",
                YearOfPublication = "2012"
            };

            var patent2 = new
            {
                Title = "Reflection Dynamic",
                YearOfPublication = "2012"
            };
            var patent3 = new
            {
                Title = "Grade ",
                Year = "2011"
            };
            Console.WriteLine("{0},{1}", patent1.Title, patent1.YearOfPublication);
            Console.WriteLine("{0},{1}", patent2.Title, patent2.YearOfPublication);

            Console.WriteLine("............................");
            // 显然编译器生成匿名类型时,重写了ToString
            Console.WriteLine(patent1);
            Console.WriteLine(patent2);
            Console.WriteLine("............................");
            Console.WriteLine(patent3);
}

  Console.WriteLine(patent1); 这一句输出的是 属性名-值。

WriteLine执行的时候,会隐式调用ToString方法。而本例输出的是有规则的键值对,所以表明编译器生成匿名类型时重写了ToString类型的方法,所以WriteLine才会输出键值对。

二、匿名类型的类型。

1、只读的属性

继续上面的代码,当我写入

1 patent1.Title = "aaa"; 匿名类型的属性一旦实例化,便无法更改。

时,报错,Title属性是只读的。即匿名类型一旦实例化则其属性无法更改。这样防止编译器做类型推断时出错。

2、强类型。

匿名类型仍然是有类型的,不表示说像C++ 中 void*一样指向任何类型。当编译器编译的时候,会根据匿名类型右侧推断出变量的类型。

例如

string text = "this is a string type";

var text = "this is a string type";

生成了CIL(公共中间语言)是一致的。

3、匿名类型声明时,属性名称 类型 顺序完全一样才属于同一种类型,可以互相引用。

之所以要求顺序是基于以下考虑:

前文提到,ToString针对定义的匿名类型重写了,如果属性顺序不同使用同一个ToString,则会出现不同的输出结果。另外,在动态编程中,会反射或者动态调用一个属性,如果属性顺序不同的两个匿名类型当作同一个类型,则调用属性的时候会出现比较大的问题。

 
原文地址:https://www.cnblogs.com/tntboom/p/4139957.html