一、匿名类型

  下面一段代码展示了如何定义并且使用匿名类型:

static void Main(string[] args)
{
var patent1 = new
{ Title = "Net Management",
YearOfPublication = "2012"
}; var patent2 = new
{
Title = "Reflection Dynamic",
YearOfPublication = "2012"
};
var patent3 = new
{
Title = "Grade ",
Year = "2011"
};
Console.WriteLine("{0},{1}", patent1.Title, patent1.YearOfPublication);
Console.WriteLine("{0},{1}", patent2.Title, patent2.YearOfPublication); Console.WriteLine("............................");
// 显然编译器生成匿名类型时,重写了ToString
Console.WriteLine(patent1);
Console.WriteLine(patent2);
Console.WriteLine("............................");
Console.WriteLine(patent3);
}

  Console.WriteLine(patent1); 这一句输出的是 属性名-值。

WriteLine执行的时候,会隐式调用ToString方法。而本例输出的是有规则的键值对,所以表明编译器生成匿名类型时重写了ToString类型的方法,所以WriteLine才会输出键值对。

二、匿名类型的类型。

1、只读的属性

继续上面的代码,当我写入

 patent1.Title = "aaa"; 匿名类型的属性一旦实例化,便无法更改。

时,报错,Title属性是只读的。即匿名类型一旦实例化则其属性无法更改。这样防止编译器做类型推断时出错。

2、强类型。

匿名类型仍然是有类型的,不表示说像C++ 中 void*一样指向任何类型。当编译器编译的时候,会根据匿名类型右侧推断出变量的类型。

例如

string text = "this is a string type";

var text = "this is a string type";

生成了CIL(公共中间语言)是一致的。

3、匿名类型声明时,属性名称 类型 顺序完全一样才属于同一种类型,可以互相引用。

之所以要求顺序是基于以下考虑:

前文提到,ToString针对定义的匿名类型重写了,如果属性顺序不同使用同一个ToString,则会出现不同的输出结果。另外,在动态编程中,会反射或者动态调用一个属性,如果属性顺序不同的两个匿名类型当作同一个类型,则调用属性的时候会出现比较大的问题。

 

C#之匿名类型与隐式局部变量的更多相关文章

  1. Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL

    Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3 ...

  2. 错误 128 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”

    原因是DataGridView中列的Name属性值和DataPropertyName属性值一样,比如Name="CardID",DataPropertyName="Car ...

  3. C# 泛型 无法将类型xx隐式转换为“T”

    原文:C# 泛型 无法将类型xx隐式转换为“T” 直接奖泛型转为T是不能转换的 要先转Object 例: public static T GetValue<T>(string inValu ...

  4. ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换

    js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...

  5. java中类型的隐式转换

    byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double

  6. dynamic基元类型与隐式类型的局部变量var

    dynamic代码示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; na ...

  7. js基本类型,隐式转换,变量

    Js笔记(脚本语言 node.js) Js五种基本类型:数字,字符串,布尔,null,undefined: HTML结构,表现,行为分离. 变量命名规则: 以字母或[下划线开始($)]不推荐,后面跟上 ...

  8. c++中istream类型到bool类型的隐式转换

    事情的起因是见到了这种用法: while(cin>>m>>n&&m&&n) { } 现在分析一下,cin>>m>>n返回 ...

  9. 解决Html.CheckBoxFor中”无法将类型 bool 隐式转换为 bool。存在一个显式转换..."的方法

    在后面加.Value属性 @Html.CheckBoxFor(m => m.IsComment.Value, new { style = "vertical-align: middle ...

随机推荐

  1. 用了skin皮肤控件之后,报错:容量超出了最大容量 参数名:capacity

    http://blog.csdn.net/keenweiwei/article/details/7403869 用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity MessageBo ...

  2. 共享一个MVC通过NPOI导出excel的通用方法

    public static System.IO.MemoryStream ExportExcel<T>(string title, List<T> objList, param ...

  3. 使用 Razor 生成 HTML5 中的 data- 属性

    在 HTML5 中, 可以使用 data- 属性来表示用户数据,这些数据甚至可以是 JSON 格式的数据,对 Web 前端开发带来很大的方便. 在 MVC 的 Razor 中,可以使用匿名对象来生成定 ...

  4. Android 中获取 debug 测试 SHA1 和 release SHA1 证书指纹数据的方法

    百度地图开发的时候要申请KEY,需要提供SHA1证书指纹数据 Eclipse eclipse中直接查看:windows -> preferance -> android -> bui ...

  5. J1签证办理全过程

    从3月底开始申请,整理J1的材料,一直到现在VISA的status变成了issued,中间被check了20多天,终于快要可以去silicon valley了. 废话不多说,J1签证很easy,不要有 ...

  6. 基于jQuery的web在线流程图设计器GooFlow

    简易的流程图设计控件,效果图: JavaScript源文件在GooFlow.js中,样式文件是GooFlow2.css.可以自定义样式. GooFlow_item类是每个项的样式属性. 但估计实现任务 ...

  7. Android中各组件的生命周期

    1.Activity生命周期图 二.activity三种状态 (1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个 ...

  8. ASP.NET MVC 开源项目学习之ProDinner (二)

    下面我们来看第二层:Data   这一层相对来说是对Core层的具体实现了. 从命名可以看出来,这和数据库相关. 1.Db.cs CodeFirst模式的本地数据库类,继承了DbContext. pr ...

  9. jquery获取对象

    1.JQuery的核心的一些方法 $("Element").length; ‘元素的个数,是个属性 $("Element").size(); ’也是元素的个数, ...

  10. .NET Reflector反编译的方法

    首先启动.NET Reflector,然后添加进入dll或exe.然后选择Export Source Code...,将反编译后的代码文件,生成到指定目录. 到这一步骤时,稍等一会,就能够在指定目录就 ...