匿名类型是一种没有名字的类型,可以使用 匿名类型 实现在一个类中定义一组只读属性,????????的是,这个类你不需要预先定义,本篇就来讨论下 匿名类型 是什么?为什么这么重要?如何在 C# 中使用好这个类型。

理解 匿名类型

本质上来说,匿名类型其实也是一个引用类型,通常用 var 来接这个引用,在匿名类型中可以定义一个或者多个属性,不过这些属性在匿名类型中会被自动做成 只读属性,和传统的的 class 相比,匿名类型中不能定义 字段,方法,只能包含只读属性。

使用 匿名类型

现在来研究一下具体代码,考虑如下的匿名类型。


var author = new
{FirstName = "Joydip",LastName = "Kanjilal",Address = "Hyderabad, INDIA"
};

在上面的代码中,author 就是匿名类型的实例,这个匿名类型中包含三个属性: FirstName,LastName,Address,可以看出这些属性都是 string 类型,有一点挺特别的,在给属性赋值之前你不必给该属性定义类型。

下面的代码段展示了如何输出这个匿名类型的三个属性。


Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);
Console.WriteLine("Address: {0}", author.Address);

内嵌匿名类型

匿名类型除了平级定义,还可以嵌套定义,做法就是,在一个匿名类型的属性中再设置一个匿名类型,下面的代码展示了这种情况。


var author = new
{FirstName = "Joydip",LastName = "Kanjilal",Address = new { City = "Hyderabad", Country = "INDIA"}
};

接下来看一下如何去访问嵌套匿名类型中的属性。


Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);
Console.WriteLine("Address: {0}", author.Address.City);

完整的代码如下,可供参考。


static void Main(string[] args)
{var author = new{FirstName = "Joydip",LastName = "Kanjilal",Address = new { City = "Hyderabad", Country = "INDIA"}};Console.WriteLine("Name: {0} {1}", author.FirstName, author.LastName);Console.WriteLine("Address: {0}", author.Address.City);Console.Read();
}

LINQ 中使用 匿名类型

LINQ 中的 Select 短语常常使用 匿名类型 来生成一个匿名类型集合。

考虑下面的 Author 类。


public class Author
{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }
}

下面的代码片段展示了如何生成 authors 集合。


IList<Author> authors =
new List<Author>()
{new Author() { Id = 1, FirstName = "John", LastName = "Willey"} ,new Author() { Id = 2, FirstName = "Steve", LastName = "Smith"} ,new Author() { Id = 3, FirstName = "Bill", LastName = "Ruffner"} ,new Author() { Id = 4, FirstName = "Joydip",  LastName = "Kanjilal" }
};

下面的代码片段展示了如何利用 Linq.Select + 匿名类型 来返回这个 执行查询,这是什么意思呢?就是说这个 result 是一个 IEnumerable 接口,结果只是一个执行计划,还没有被真正执行。


var result = from a in authors select new
{Id = a.Id,Name = a.FirstName + "\t"+ a.LastName
};

如果想看到最后的执行结果,可以使用如下代码段:


foreach (var data in result)Console.WriteLine(data.Name);

下面是可供参考的完整代码。


public class Author{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }}class Program{static void Main(string[] args){IList<Author> authors = new List<Author>() {new Author() { Id = 1, FirstName = "John",LastName = "Willey"},new Author() { Id = 2, FirstName = "Steve",LastName = "Smith"},new Author() { Id = 3, FirstName = "Bill",LastName = "Ruffner"},new Author() { Id = 4, FirstName = "Joydip",LastName = "Kanjilal"}};var result = from a in authorsselect new{Id = a.Id,Name = a.FirstName + "\t" + a.LastName};foreach (var data in result)Console.WriteLine(data.Name);Console.Read();}}

匿名类型允许你创建一个类型并且可以在事前不定义类型的情况下快速的初始化它,从 CLR 的角度看,匿名类型 也是一个引用类型,编译器在编译时,会给 每一个匿名类型 赋予一个 明确的名字。

匿名类型是继承于 Object 的,这就是为什么匿名类型只能转成 Object 的原因,还有一点要注意,方法,属性,事件,委托 的返回值不可以是匿名类型。

译文链接:https://www.infoworld.com/article/3536470/how-to-use-anonymous-types-in-csharp.html

如何在 C# 中使用匿名类型相关推荐

  1. 如何在 IIS 中添加 MIME 类型

    MIME 类型用于查找特定文件类型的管理方式,它指示文件的性质和格式. 今天,让我们详细了解一下如何在 IIS 中添加 MIME 类型. 什么是 MIME 类型? MIME(多用途 Internet ...

  2. c语言中int64类型,stdint - 如何在C中打印int64_t类型

    stdint - 如何在C中打印int64_t类型 C99标准具有整数类型,字节大小类似于int64_t. 我使用以下代码: #include #include int64_t my_int = 99 ...

  3. Windows Server 2008 如何在IIS中添加MIME类型

    用户可以通过使用MIME以设置服务器传送多媒体文件,如声音和视频等.MIME是一种技术规范,现在可以用于浏览器上,传送可以供浏览器识别的信息 如果我们的网站提供下载服务,有时传上去的文件比如 xxx. ...

  4. 如何在Access中参数化日期类型,以解决Data type mismatch in criteria expression的问题...

    最近的一个项目要使用Access,用惯了SQLServer,一下子回到Access真是有点不太习惯.在使用Access插入日期数据时,总报Data type mismatch in criteria ...

  5. python中none是什么类型_如何在Python中”测试”None类型?

    我有一个方法,它有时返回一个非类型的值.那么我怎样才能质疑一个非类型的变量呢?例如,我需要使用if方法 if not new: new = '#' 我知道这是错误的方式,我希望你理解我的意思. 我想这 ...

  6. linux printf int64,关于stdint:如何在C中打印int64_t类型

    C99标准具有整数类型,字节大小类似于int64_t. 我使用以下代码: #include #include int64_t my_int = 999999999999999999; printf(& ...

  7. c语言int t格式,如何在C中打印int64_t类型

    C99标准具有整数类型,字节大小类似int64_t.我使用下面的代码: #include #include int64_t my_int = 999999999999999999; printf(&q ...

  8. 如何在html中添加qsv类型的视频,qsv视频格式处理技巧,用转换器就可以实现

    原标题:qsv视频格式处理技巧,用转换器就可以实现 又到了和大家分享的时刻了,说到这我不得不吐槽一下我的表妹!哎呀这前两天我正在家里看鬼片,突然手机就响起来了,我的天当时真的是给我吓了一个大条!!!接 ...

  9. 如何在Access2007中使用日期类型查询数据

    select * from 表 where datediff("d",日期型的字段,#2008-09-01#)=0 或 select * from 表 where 日期型的字段 & ...

最新文章

  1. 源程序,解释器,编译器
  2. ora-1031解决一例
  3. easypoi必填项_GitHub - wangjingting/poi-utils: help you more easy read or write excel file
  4. [转] apache2: bad user name ${APACHE_RUN_USER}
  5. Shell echo-使用echo实现更复杂的输出格式控制
  6. uniapp动态修改样式_uniapp样式动态绑定
  7. CentOS 利用Yum安装mysql后无法启动(MySQL Daemon failed to start.)
  8. 更新T1表,要添加一个条件A,但T1表没有A字段
  9. Https如何做到通信安全
  10. ibm服务器安装2003系统,IBM X3650 M3服务器安装windows 2003的方法
  11. Qt多线程之QThread
  12. html九九乘法口诀表代码,JavaScript九九乘法口诀表的简单实现
  13. centos7 防火墙
  14. 为了强调低电平有效,有时也将反相器图形符号中表示反相的小圆圈画在输入端,例如上图的左边一列反相器的画法
  15. 华硕ac86u文件服务器,数码教程资讯:华硕RT-AC86U路由器怎么设置FTP共享服务
  16. java修炼之多线程学习心得
  17. 几何线条科技感员工转正述职报告PPT模板-优页文档
  18. 第一积分中值定理(两种形式)的证明
  19. 啤酒车间平面布置图、水厂平面布置图、厂房设备布置图、污水厂管道布置图、乳品厂平面布置图、水果罐头工厂厂区总平面布置图、煤矿开采工作面综合布置图、日产500吨石灰窑CAD工艺布置图……各种布置图汇总
  20. Containerd客户端工具(CLI)介绍ctr,nerdctl,crictl,podman以及docker

热门文章

  1. iOS-生成二维码图片【附中间带有小图标二维码】(QRCode)
  2. nj08---process、console
  3. 软件测试技术第二次作业——程序错误的判断
  4. thinkphp中表有前缀名的时候申明模板的方法
  5. C# 内存法图像处理
  6. Leetcode: Valid Parentheses
  7. Execute .NET Code under SQL Server 2005
  8. SQL进阶提升(疑惑篇order by)-学习sql server2005 step by step(十一)
  9. 一个女孩子对老公/男朋友的要求
  10. mysql 三主_MySQL主主复制3