匿名变量

1 引入匿名变量函数

  在不少状况下,咱们须要一种可以临时将一批具备必定关联的数据存放起来的对象;或者在某些状况下,咱们对仅一个对象的“形状”(如属性的名字和类型等)比较感兴趣。例如Book类,当它和其余商品放在一块儿进行查询时,咱们可能仅对其名称和价格感兴趣,而且但愿将这两种属性放在另一个单独的临时对象中以备从此使用。这时,咱们关注的仅仅是这个临时对象具备NamePrice的属性感兴趣,至于它到底是什么类型就可有可无了。然而,为了使这样一个对象得以存在,咱们不得不为这个可有可无的类型写上一大堆“样本代码”,无非就是定义一个如BookAsGood的类,其中无非也就是形如m_namem_price的私有域和名为NamePrice的公共可读写方法。代码以下所示:this

public class BookAsGoodspa

    {对象

        // 定义一组私有成员变量继承

        private string m_name;索引

        private double m_price;get

        // 为成员变量设置属性编译器

        public string Namestring

        {it

            get

            {

                return this.m_name;

            }

            set

            {

                this.m_name = value;

            }

        }

 

        public string Price

        {

            get

            {

                return this.m_price;

            }

            set

 

            {

                this.m_price = value;

            }

        }

    }

 

若是像这样封装的成员太多,代码量仍是很可怕的,而且维护的工做量也至关大。针对于这些问题,在C# 3.0中,咱们有了一个解决这种问题的捷径,称之为匿名类型,它是C#匿名方法语法的扩展。

 

  2 建立和使用引入匿名变量

  varnew关键字一块儿使用时,能够建立匿名类型。匿名类型只是一个继承了object的、没有名称的类。该类的定义从初始化器中推断,相似于隐式类型化的变量。看下面的例子:

  若是须要一个对象包含名字和价格,则能够声明以下:

// 表明一些书的一个匿名对象

 

var book = new { Name = "C#", Price = 100};

  这会生成一个包含NamePrice属性的对象。若是建立另外一个对象,以下所示:

var bookA = new { Name = "C# 3.0", Price = 80 };

  其中,bookbookA的类型就是相同的。例如,咱们能够这样设置:

book = bookA;

 

 

  若是所设置的值来自于另外一个对象,初始化器就能够简化。若是已经有一个包含NamePrice属性的类,且有一个该类的实例b,则book对象就能够初始化为:

BookAsGood b = new BookAsGood();

 

var book = new { b.Name, b.Price };

  在上面的代码中,b对象的属性名应投射为新对象名book。因此book对象应有NamePrice属性。

  定义好以后,咱们就能够这样来访问它的属性,如:

// 像普通实例那样访问其中的属性

 

Console.WriteLine(book.Name);

  若是换成这样访问呢?如:

book.Name = "C# 3.0";

  编译器会报错:没法对属性或索引器“AnonymousType#1.Name”赋值 -- 它是只读的。由于在这里book的各个属性只实现了get而没有实现set。所谓“匿名类型”,能够看到,咱们有了一个叫作book的实例,但却没有它的强类型名称,在定义的时候将其定义为隐式类型(事实上这也是强制的)。在给它指定属性的时候也采用的对象初始化器的语法。在实际运行的时候,C#编译器会为它生成一个隐藏的类型名称,咱们在程序中是不能对它进行访问的。

 

一个匿名类型也是它的生存周期,那就是在生成它的方法以内。若是要向另外一个方法以参数的形式传递它,那就必须先将其转换为object类型(匿名类型也是从object直接派生而来的)。可是这样会毁坏它内部属性的强类型。若是须要保持内部属性的强类型,因此建议在大多数状况下,仍是采用传统的类或者结构体来存储数据比较可靠。

 

  3 匿名变量与隐式类型变量的区别

  l、隐式类型变量是指咱们能够经过等号右边的表达式,推断出等号左边该是那种类型。如:

var Name = "C#";

  咱们能够根据等号右边的表达式“C#”,推断出等号左边的变量Namestring类型。

  2、 匿名变量则是指根据这个类型的初始化函数,咱们能够推导出和建立出这个类型的实例。这两个特性不少时候是一块儿做用的。如:

var book = new { Name = "C#", Price = 100};

  上面的book就是一个匿名变量。其中的Name = "C#"Price = 100又能够分别看做是隐式类型变量。



转自百度文库

相关文章
相关标签/搜索