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,则会出现不同的输出结果。另外,在动态编程中,会反射或者动态调用一个属性,如果属性顺序不同的两个匿名类型当作同一个类型,则调用属性的时候会出现比较大的问题。

 

你可能感兴趣的:(局部变量)