LINQ学习系列-----1.4 匿名对象

 

      本篇内容接着上一篇继续讲述,本篇简单讲解匿名对象

      一.匿名对象介绍

             上代码:                    

var result=new {
                            ID=1,
                            Name="张三",
                            Age=23
                        };
View Code

             若想输出这个新对象的Age属性的内容,可以让Console.WriteLine深入到该对象的下一层,Console.WriteLine(reuslt,1)即可

             虽然匿名对象没有对象名,不过仍然是类型---编译器将自动为其生成名字。代码的result将指向上述自动创建的类型的一个实例。该类型有三个属性:ID,Name,Age。这三个属性是根据初始化器中的声明而推断得出的。

    二.匿名对象属性一致的问题

var result1=new {ID=2,Name="李四",Age=33};
var result2=new {ID=3,Name="张三",Age=11};
var result3=new {ID=3,Name="张三"};"
View Code

             上述代码中result1和result2属于同一个类型的两个不同的实例。但是result3和result1、result2是属于不同的类型,因为属性不一致。

             注意:上述代码中如果属性的顺序不一致,导致的类型 也是不一致的。

     三.匿名对象的限制

              1.使用匿名类型时,离开定义该类型的方法,我们将无法再以强类型的方式使用此匿名类型的实例。若要使在此方法内,我们希望将某个匿名类型的实例传递给某一方法的话,被传递的方法的这个参数的类型必须是object.

              2.在定义匿名类型的方法之外,我们只能使用反射来进一步操作该类型的实例。

              3.定义该匿名类型的方法的返回值类型必须是object,否则匿名类型将不能够作为方法的返回值。

              4.匿名类型的实例时不可变的,一旦创建了一个匿名类型的实例,那么该实例的各个属性值就将永远被确定下来了,所有的属性只能get,不能set。

     四.匿名对象的不可变特性

              因为匿名类型具有不可变的特性,所以其所有的实例都有稳定的散列值(hash code)。

              匿名对象不可变的目的:永远不会改变的对象能够大大降低程序设计中对并发控制的处理难度。这在后续的PLINQ中起着非常关键的作用。(在某个对象在某个时刻的快照的时候无需考虑其可能带来的不一致的副作用)。

posted @ 2017-11-28 14:57  小王子的博客  阅读(377)  评论(0编辑  收藏  举报