【C#进阶系列】10 属性
属性分为无参属性和有参属性(即索引器)。
属性相对于字段的优点不仅仅是为了封装,还可以在读写的时候做一些额外操作,缓存某些值或者推迟创建一些内部对象,也适用于以线程安全的方式访问字段。
话说最基本的属性就不讲了,太平常了。
基本上很多文章都是讲属性的好处的,所以下面就讲一下属性的不足:
属性不能作为out和ref传参。属性实质上是方法而不是字段,因为属性在编译后实际上是方法。
属性可能花较长时执行,而字段访问则是立即完成。
许多人使用属性是为了线程同步,这就可能造成线程永远终止,要线程同步就不要使用属性。
如果属性所在类可以被远程访问,那么调用属性会非常慢。
在上面这些情况下,应该优先使用方法而不是属性。
并且《CLR via C#》的作者十分不推荐使用属性,而是使用方法。
匿名类型
先上一段匿名类型的代码
var man=new {Name="Troy",Age=};
这段代码在C#编译器中会先推断Name和Age的类型,然后给他们分别创建私有字段,再然后就为这两个私有字段创建只读属性。然后就创建一个构造器初始化私有只读字段。
并重写Object的Equals(判断每个字段是否都想等),GetHashCode(根据每个字段的哈希码生成哈希码)和ToString(返回“属性=值”对的以逗号分隔的列表)。
如果编译器发现代码中定义了多个匿名类型,但是这些匿名类型的每个属性都具有相同的类型和名称以及顺序。那么实际上它只会创建一个匿名类型定义。
Tuple类型
在System命名空间中,有几个泛型Tuple(元组)类型,它们全部从Object派生,区别只在于元数的个数。
和匿名对象一样,Tuple创建好后就不可变了(所有属性都是只读)。
匿名对象的属性调用是通过具体的属性名,然而Tuple类型只能通过Item1这样的方式调用。例子如下:
var man = new Tuple<string, int, string>("Troy", , "男");//构造器方式
var boy = Tuple.Create("Fuckboy", , "男");//静态工厂方法创造
Console.WriteLine(man.Item1);//Troy
Console.WriteLine(man.Item2);//
Console.WriteLine(man.Item3);//男
//匿名对象方式
var myObj = new { Name = "Troy", Age = , Sex = "男" };
Console.WriteLine(myObj.Name);//Troy
Console.WriteLine(myObj.Age);//
Console.WriteLine(myObj.Sex);//男
//另一种组合键值对的方式,感觉像在写js
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Name = "Troy";
obj.Age = ;
obj.Sex = "男";
Console.WriteLine(obj.Name);//Troy
Console.WriteLine(obj.Age);//
Console.WriteLine(obj.Sex);//男
Console.Read();
有参属性(索引器)
C#使用数组风格的语法来公开有参属性。
CLR本身并不区分有参属性和无参属性,对它而言,每个属性都只是类型中定义的一对方法和一些元数据。而用数组风格的语法来玩有参属性是C#特有的,编译之后还是会编译成IL代码中的方法。
JIT对属性的优化
对简单的get和set访问其方法,JIT编译后会将访问其代码直接嵌入到调用属性的方法中,这样就避免了运行时发出调用所产生的开销。代价就是编译后的方法变得更大,可以想象一下调用属性的方法有很多个,那么嵌入的重复代码就有很多。
所以我们应该在属性访问器里写的代码应该尽可能少,否则用方法也不错。如果这样做了,那么JIT这样优化后,生成的本机代码会变得更小,而且执行更快。
【C#进阶系列】10 属性的更多相关文章
- SilkTest高级进阶系列10 – bitmap工具bitview
SilkTest 提供了一个bitmap的工具,它可以帮助我们捕捉,比较bitmap文件.该bitmap工具的位置是~/SilkTest/bitview.exe 运行该工具后,你会发现它提供了捕捉控件 ...
- .Net进阶系列(10)-异步多线程综述(被替换)
一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...
- HTML5 进阶系列:indexedDB 数据库
前言 在 HTML5 的本地存储中,有一种叫 indexedDB 的数据库,该数据库是一种存储在客户端本地的 NoSQL 数据库,它可以存储大量的数据.从上篇:HTML5 进阶系列:web Stora ...
- JS进阶系列之作用域链
在之前写的进阶系列里面,提到了执行上下文在创建阶段,要创建变量对象.确定作用域链还有确定this的指向,本次将重点讲解一下作用域链. JavaScript代码的执行过程 在讲解作用域链之前,首先了解一 ...
- 【 D3.js 进阶系列 — 4.0 】 绘制箭头
转自:http://www.ourd3js.com/wordpress/?p=660 [ D3.js 进阶系列 — 4.0 ] 绘制箭头 发表于2014/12/08 在 SVG 绘制区域中作图,在绘制 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身
Bing Maps进阶系列七:Bing Maps功能导航菜单华丽的变身 Bing Maps Silverlight Control所提供的功能导航是非常强大的,在设计上对扩展的支持非常好,提供了许多用 ...
- Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图
Bing Maps进阶系列六:使用Silverlight剪切(Clip)特性实现Bing Maps的迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方面的开 ...
- Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...
随机推荐
- BTrace入门教程
bin版:https://kenai.com/projects/btrace/downloads/directory/releases 源码:https://github.com/btraceio/b ...
- Asp.net Core WebApi 返回JSON自动驼峰格式化问题
从今天开始,正式进入Asp.net Core的开发,估计最近一段时间会经常写博客了,记录学些Asp.net Core中遇到的各种坑. 第一个问题:通过core编写的webapi,默认返回的json会自 ...
- 分享一个web应用程序池管理工具
因为项目在联调阶段由于各种各样的原因需要重启应用程序池,而调试服务器基本都需要远登操作.同样的情况也会发生在线上,如果公司权限控制得比较严格,每次都要多部门的服务器权限申请的话有点麻烦, 所以抽点时间 ...
- 使用PopupWindow实现Menu功能
参考:http://www.cnblogs.com/sw926/p/3230659.html 注意: PopupWindow会给PopupView设置Padding,会导致ContentView的左右 ...
- windows原生开发之界面疑云
windows桌面开发,界面始终是最大的困惑.我们对前端工具的要求,其实只有窗体设计器.消息映射,过分点的话自适应屏幕.模型绑定.能够免于手工书写,其实这个问题并不复杂,但VS不实现.QT语法 ...
- Debug Assertion Failed! Expression: _pFirstBlock == pHead
点击Abort之后,查看调用栈,发现异常在函数return时被时产生,进一步看是vector的析构函数被调用时产生,以前没开发过C++项目,没什么经验,这个错误让我很困惑,第一,我电脑上并没有f盘:第 ...
- bss段和data段的区别
一般情况下,一个程序本质上都是由 bss段.data段.text段三个组成的——本概念是当前的计算机程序设计中是很重要的一个基本概念.而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大 ...
- Amazon的Fire Phone之于Android开发者
在上周Amazon也耐不住加入了手机竞争行列之中,发布了自己的Fire Phone,于是Android家族又多了一位变种成员,Android系统的碎片化程度也进一步加剧.因为工作的关系,我有幸在上个月 ...
- [转]C++学习–基础篇(书籍推荐及分享)
C++入门 语言技巧,性能优化 底层硬货 STL Boost 设计模式 算法篇 算起来,用C++已经有七八年时间,也有点可以分享的东西: 以下推荐的书籍大多有电子版.对于技术类书籍,电子版并不会带来一 ...
- IIS7/IIS7.5 二级域名伪静态设置方法
转载地址:http://www.admin5.com/article/20120107/402582.shtml