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 ...
随机推荐
- 【转】Bash脚本实现批量作业并行化
首先附上自己常用的代码 ---------------------------------------------------------------------------------------- ...
- MacPE+WinPE-黑苹果之路
装黑苹果过程中,安装.备份.恢复都需要启动到MAC,总是从硬盘启动对于硬盘数据风险太大,琢磨着安装个pe用来维护,此外手上的winpe,也想着一并实现,免得搞两个u盘.找了个网页开工,http://b ...
- 带你快速了解CODESOFT 2015
CODESOFT是知名的条码标签设计打印软件,现在又推出了最新版CODESOFT 2015,其新功能.大改进让人为之一振.下面跟随小编的脚步,走进CODESOFT 2015,看一看CODESOFT 2 ...
- python-appium练习编写脚本时遇到问题
遇到问题: 1.安卓4.2及以下系统无法识别resource-id属性 只能用text属性识别 2.输入中文无法识别 脚本最顶部增加#coding=utf-8 3.对象无法识别resource-id属 ...
- [工具] 如何利用Notepad++去除重复行
问题: 需要去除重复数据, 例如: 解决方案: 1. 打开notepad++: 2. 如果没有找到"TextFx" 选项, 需要先安装该插件. 依次打开"插件" ...
- python学习笔记(sqlalchemy安装失败)
博主今天折腾了一天sqlalchemy安装问题 下面是失败的截图 直接重新安装python2.7仍未解决此问题 最终在一国外论坛中找到解决的方法: 安装VC++对python的支持文件 VCForPy ...
- 【Unity Shaders】学习笔记——渲染管线
[Unity Shaders]学习笔记——Shader和渲染管线 转载请注明出处:http://www.cnblogs.com/-867259206/p/5595924.html 写作本系列文章时使用 ...
- 关于NopCommerce3.6版用户登录详解
一.登录方式 Nop登录方式有两种(且只能选择一种方式登录):一种是用用户名登录,另一种是用户注册邮箱登录,这个在后台可配置: 第一种:用户名登录 后台配置路径在商城设置à设置管理à客户设置:使用用户 ...
- LA3902 Network
给出一棵树,对于每一个叶子节点要使得在它的k距离内至少一个节点被打了标记,(叶节点不能打标记,非叶结点也不必满足这个条件),现在已经有一个节点s被打了标记,问至少还要打几个标记(这表达能力也是捉急.. ...
- Android fragment 想activity 传送数据
fragment可以通过定义 fragment的接口的方法来 想activity传送数据: 而activity则是通过实现 fragment的接口来接收fragment的送来的数据: 1.在fragm ...