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

可通过使用 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. 飞翔的圆(Flappy Bird)游戏源码

    这个源码是一个不错的休闲类的游戏源码,飞翔的圆(Flappy Bird)游戏源码V1.0,本项目是一个仿Flappy Bird的小游戏,只不过是把Flappy Bird里面的鸟替换成了简单的圆.感兴趣 ...

  2. Outlook 2007无法打开链接"由于本机的限制 该操作已被取消"

    编写人:CC阿爸 2014-2-17 近来在日常维护中,经常性的遇到用户在outlook中打开链接,提示[由于本机的限制,该操作已被取消],第一次的在网上搜索到解决办法后, 第二次再处理时,又没能记住 ...

  3. 兼容ie7的导航下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. linux下关于mysqldump备份的.sql导入数据库表数据丢失优化

    直切正题 前2个随笔做了linux下自动备份,但是备份的.sql文件发现表数据丢失,原因是数据库太大我的数据库文件是804M,在用ftp拉去也会丢失数据 所以对db.sh备份数据库加一个压缩gizp ...

  5. Android Material Design:NavigationView抽屉导航菜单

    需要添加的包: 测试代码: package com.zzw.navigationview; import android.app.Activity; import android.os.Bundle; ...

  6. C# 代码重启windows服务

    ServiceController service = new ServiceController("EnergyRecordService"); protected void b ...

  7. linux之I2C裸机驱动解析(转)

    1      硬件特性 1.1 概述 I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA).由于I2C总线仅需要两根线,因此在电路板上占用的空间更少, ...

  8. C# 添加一个用户对文件或者文件夹的所有权限

    private void ModifyFilePermission(string path, string user, FileType filetype) { if (filetype == Fil ...

  9. C语言接口的写法(以toyls命令为例)

    #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  10. 对Iframe和图表设置高度的优质代码

    //对Iframe和图表设置高度 function f() { parent.window.setWinHeight(parent.window.document.getElementById(&qu ...