匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。  每个属性的类型由编译器推断。

可通过使用 new 运算符和对象初始值创建匿名类型。    有关对象初始值设定项的更多信息,请参见对象和集合初始值设定项(C# 编程指南)

以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型。

var v = new { Amount = , Message = "Hello" };

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。  有关查询的更多信息,请参见 LINQ 查询表达式(C# 编程指南)

匿名类型包含一个或多个公共只读属性。  包含其他种类的类成员(如方法或事件)为无效。  用来初始化属性的表达式不能为 null、匿名函数或指针类型。

最常见的方案是用其他类型的属性初始化匿名类型。  在下面的示例中,假定名为 Product 的类存在。  类 Product 包括 Color 和 Price 属性,以及您不感兴趣的其他属性。  变量 products 是 Product 对象的集合。  匿名类型声明以 new 关键字开始。  声明初始化了一个只使用 Product 的两个属性的新类型。  这将导致在查询中返回较少数量的数据。

如果您没有在匿名类型中指定成员名称,编译器会为匿名类型成员指定与用于初始化这些成员的属性相同的名称。  必须为使用表达式初始化的属性提供名称,如下面的示例所示。  在下面示例中,匿名类型的属性名称都为 Color 和 Price。

var productQuery =
from prod in products
select new { prod.Color, prod.Price }; foreach (var v in productQuery)
{
Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

通常,当您使用匿名类型来初始化变量时,可以通过使用 var 将变量作为隐式键入的本地变来变量进行声明。  类型名称无法在变量声明中给出,因为只有编译器能访问匿名类型的基础名称。  有关var的更多信息,请参见隐式类型的局部变量(C# 编程指南)

可通过将隐式键入的本地变量与隐式键入的数组相结合创建匿名键入的元素的数组,如下面的示例所示。

var anonArray = new[] { new { name = "apple", diam =  }, new { name = "grape", diam =  }};
备注
匿名类型是直接从 对象派生,因此,无法转换到除了 对象的任何类型的 类型。 虽然您的应用程序不能访问它,编译器还是提供了每一个匿名类型的名称。  从公共语言运行时的角度来看,匿名类型与任何其他不同的引用类型。

如果程序集的两个或多个匿名对象初始值设定项指定的顺序,并具有相同名称和属性的顺序,编译器将对象作为相同类型的实例。               它们共享同一编译器生成的类型信息。

无法将字段、属性、时间或方法的返回类型声明为具有匿名类型。               同样,您不能将方法、属性、构造函数或索引器正式声明为匿名类型的。  要将匿名类型或包含匿名类型的集合作为参数传递给某一方法,可将参数作为类型对象进行声明。  但是,这样做会使强类型化作用无效。  如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。

由于匿名类型上的 EqualsGetHashCode 方法是根据方法属性的 Equals 和 GetHashcode 定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。

匿名类型(C# 编程指南)的更多相关文章

  1. Core Animation编程指南

    本文是<Core Animation Programming Guide>2013-01-28更新版本的译文.本文略去了原文中关于OS X平台上Core Animation相关内容.因为原 ...

  2. 指针类型(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx 在不安全的上下文中,类型可以是指针类型.值类型或引用类型. 指针类型声明采用下列 ...

  3. C#编程(十六)----------匿名类型

    匿名类型 var和new关键字一起使用,可以创建匿名类型. 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用 ...

  4. Lambda 表达式(C# 编程指南) 微软microsoft官方说明

    Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...

  5. 使用委托(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/ms173172.aspx 委托是安全封装方法的类型,类似于 C 和 C++ 中的函数指针.  与 C 函数 ...

  6. 编程基础-msdn编程指南笔记

    此博仅为笔记,摘自msdn编程指南文档,链接地址:http://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx 注释:// 单行注释 /* 多行注释*/ ...

  7. (zz)Lambda 表达式(C# 编程指南)

    https://msdn.microsoft.com/zh-cn/library/bb397687.aspx Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数.通过使用 lambd ...

  8. Java 脚本化编程指南

    Java 脚本化编程指南 Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的 ...

  9. Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

随机推荐

  1. 对话框AlertDialog的基本类型与创建

    测试代码: 布局: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  2. 搭通自己的电脑与GitHub的传输通道

    一.远程仓库怎么玩 1. 自己搭建一个运行Git的服务器 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,但肯定有一台机器有着最原始的版本库,然后别的机器来克隆这个原始版本库,这 ...

  3. 关联参数(&的用法)

    <?php header("Content-Type:text/html;charset=gb2312"); function test1(&$a){ $a.=&qu ...

  4. GUID,UUID

    <? class System { function currentTimeMillis() { list($usec, $sec) = explode(" ",microt ...

  5. about the pageload and page init event

    Page_Init The Page_Init event is the first to occur when an ASP.NET page is executed. This is where ...

  6. SPARK 数据统计程序性能优化。

    昨天写完R脚本 没测试就发到博客里, 结果实际运行发现很慢,运行时间在2小时以上, 查看spark控制台, 大量时间消耗在count上, 产生的stage多大70多个 . 分析原因. 1  selec ...

  7. 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)

    1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...

  8. Ubuntu无值守安装mysql

    1. 使用apt-get -d install 命令下载安装包, 其中-d表示下载不安装. 下载后的deb包放在/var/cache/apt/archives目录 2. 使用dpkg-preconfi ...

  9. RCF

    1. RCF: 纯c++的RPC, 不引入IDL, 大量用到boost,比较强大.2. casocklib:  protobuf + asio 较完善实现3. eventrpc: protobuf + ...

  10. Knockout应用开发指南 第一章:入门

    2011-11-21 14:20 by 汤姆大叔, 20165 阅读, 17 评论, 收藏,  编辑 1    Knockout简介 (Introduction) Knockout是一个轻量级的UI类 ...