C#之匿名类型与隐式局部变量
一、匿名类型
下面一段代码展示了如何定义并且使用匿名类型:
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#之匿名类型与隐式局部变量的更多相关文章
- Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL
Atitit.变量的定义 获取 储存 物理结构 基本类型简化 隐式转换 类型推导 与底层原理 attilaxDSL 1.1. $ 美元字符, php 黑头1 1.2. 默认变量的范围和声明:1 1.3 ...
- 错误 128 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”
原因是DataGridView中列的Name属性值和DataPropertyName属性值一样,比如Name="CardID",DataPropertyName="Car ...
- C# 泛型 无法将类型xx隐式转换为“T”
原文:C# 泛型 无法将类型xx隐式转换为“T” 直接奖泛型转为T是不能转换的 要先转Object 例: public static T GetValue<T>(string inValu ...
- ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换
js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...
- java中类型的隐式转换
byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double
- dynamic基元类型与隐式类型的局部变量var
dynamic代码示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; na ...
- js基本类型,隐式转换,变量
Js笔记(脚本语言 node.js) Js五种基本类型:数字,字符串,布尔,null,undefined: HTML结构,表现,行为分离. 变量命名规则: 以字母或[下划线开始($)]不推荐,后面跟上 ...
- c++中istream类型到bool类型的隐式转换
事情的起因是见到了这种用法: while(cin>>m>>n&&m&&n) { } 现在分析一下,cin>>m>>n返回 ...
- 解决Html.CheckBoxFor中”无法将类型 bool 隐式转换为 bool。存在一个显式转换..."的方法
在后面加.Value属性 @Html.CheckBoxFor(m => m.IsComment.Value, new { style = "vertical-align: middle ...
随机推荐
- Hive参数层面常用优化
1.hive数据仓库权限问题: set hive.warehouse.subdir.inherit.perms=true; 2.HiveServer2的内存 连接的个数越多压力越大,可以加大内存:可以 ...
- 菜鸟学四轴控制器之3:数字积分法DDA实现直线插补
上一篇的逐点比较法显然是无法画一条有倾角的直线的.因为X轴和Y轴永远都不同步,也就是像打台球一样,你打一个,我打一个,如果我进了球,我再接着打一个. 也就是说,如果直线为45度,也是没有办法画出来的, ...
- socket 和 SocketServer 模块
一 .Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket socket(TCP,IP)通常也称作"套接字",用于描述IP地址和端 ...
- asp.net解决数据转换为DBNULL的问题
if (string.IsNullOrEmpty(CookieHelper.GetCookie("DEPID", "theway").ToString()) = ...
- extern 相关
假如a.h中有 int a=10; t1.cpp和t2.cpp同时include "a.h"则编译不成功,因为a重复定义:如果 a.h中是 static int a=10;则可以, ...
- java中List Set Map使用
@Test public void run() { ArrayList<String> list= ...
- shell脚本循环执行mysql语句
参考资料:Shell脚本中执行mysql语句 需求:数据库里有张数据表存储的是用户对电影的评价(user_id movie_id rating time),但是我现在要每部电影的总评分. 解决方法: ...
- CLRS:max_heap and min_heap operation (pseudocode)
//max_heap heap_maximum:return A[1] O(1); Extract_Heap_maximum:swap(A[1],A[heap.size]) adjust ...
- C# 多线程传参
using System; using System.Threading; //多线程调试: 2013.10.08 namespace ThreadExample { class App { publ ...
- (笔记)angular 路由