当前位置:  编程技术>.net/c#/asp.net

C#3.0 匿名类型介绍

    来源: 互联网  发布时间:2014-08-30

    本文导语:  C#3.0引入了成为匿名类型的新功能,通过该功能可以在没有正式定义类的情况下定义数据类型,如下   var test = new {    Name = "shuyizhi",    Age = 29,   AAA = "CCC" }; C#匿名类型永远不可改动,这意味着所有的特性都是只读属性,...

C#3.0引入了成为匿名类型的新功能,通过该功能可以在没有正式定义类的情况下定义数据类型,如下
 

var test = new
{
   Name = "shuyizhi",
   Age = 29,
  AAA = "CCC"
};

C#匿名类型永远不可改动,这意味着所有的特性都是只读属性,初始化这些特性后就不可以更改他们的值。

引入匿名类型

在很多情况下,我们需要一种能够临时将一批具有一定关联的数据存放起来的对象;或者在某些情况下,我们对仅一个对象的“形状”(如属性的名字和类型等)比较感兴趣。例如Book类,当它和其他商品放在一起进行查询时,我们可能仅对其名称和价格感兴趣,并且希望将这两种属性放在另外一个单独的临时对象中以备今后使用。这时,我们关注的仅仅是这个临时对象具有Name和Price的属性感兴趣,至于它究竟是什么类型就无关紧要了。然而,为了使这样一个对象得以存在,我们不得不为这个无关紧要的类型写上一大堆“样本代码”,无非就是定义一个如BookAsGood的类,其中无非也就是形如m_name和m_price的私有域和名为Name与Price的公共可读写方法。代码如下所示:
 

代码示例:

public class BookAsGood
{
  // 定义一组私有成员变量
  private string m_name;
  private double m_price;

  // 为成员变量设置属性
  public string Name
 {
            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#匿名方法语法的扩展。

创建和使用引入匿名类型

var与new关键字一起使用时,可以创建匿名类型。匿名类型只是一个继承了object的、没有名称的类。该类的定义从初始化器中推断,类似于隐式类型化的变量。看下面的例子:
如果需要一个对象包含名字和价格,则可以声明如下:
 

// 代表一些书的一个匿名对象
var book = new { Name = "C#", Price = 100};

这会生成一个包含Name和Price属性的对象。如果创建另一个对象,如下所示:
 

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


其中,book和bookA的类型就是相同的。例如,我们可以这样设置:
 

book = bookA;

如果所设置的值来自于另一个对象,初始化器就可以简化。如果已经有一个包含Name和Price属性的类,且有一个该类的实例b,则book对象就可以初始化为:
 

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

在上面的代码中,b对象的属性名应投射为新对象名book。所以book对象应有Name和Price属性。

定义好之后,我们就可以这样来访问它的属性,如:
 

// 像普通实例那样访问其中的属性
Console.WriteLine(book.Name);

如果换成这样访问呢?如:
 

book.Name = "C# 3.0";

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

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

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

隐式类型变量是指我们可以通过等号右边的表达式,推断出等号左边该是那种类型。如:
 

var Name = "C#";

可以根据等号右边的表达式“C#”,推断出等号左边的变量Name是string类型。
匿名类型则是指根据这个类型的初始化函数,我们可以推导出和创建出这个类型的实例。这两个特性很多时候是一起作用的。如:
 

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

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


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • new Inner(){ }这个匿名类是不是就是指Inner类的一个匿名子类?
  • C#匿名委托和Java匿名局部内部类使用方法示例
  • 关于匿名FTP的问题,匿名登陆时建的目录权限为何都是000?
  • Linux下面的"匿名管道",是否对应着某种实体?
  • 如何修改centos ftp匿名登录的路径
  • freebsd下装的pureftpd,怎么开匿名用户?怎么限制它的ip地址?
  • 求肋!更改wu-ftpd匿名用户的默认目录!
  • 如何设置sco unix5.07的ftp匿名服务器
  • 如何让ftpd支持匿名访问
  • 开源匿名通讯框架 gMix
  • C# 使用匿名函数解决EventHandler参数传递的难题
  • 如何增加一个目录让用户可以以匿名的方式来访问(急,在线等待)
  • 一个菜鸟的请求: 哪位前辈能给晚辈讲讲“匿名类”
  • 如何设定LINUX下VSFTPD服务匿名登陆的默认目录
  • FTP匿名登陆 LINUX 出现错误 linux FTP 550 permission
  • java开发知识 iis7站长之家
  • 匿名管道的堵塞
  • samba匿名可写入有问题
  • vsftpd 的匿名不能删除文件的问题!!【急】
  • vsftpd给匿名用户分配上传权限遇到的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3